SQL语句技巧:查询时巧用OR实现逻辑判断
首先看以下SQL逻辑语句块:
DECLARE @fieldname varchar(50)
DECLARE @fieldvalue nvarchar(100) SET @fieldname='chassisno' --这里可传入chassisno,plateno,owner,contacttelno其中之一或不传
SET @fieldvalue='Zuowenjun' IF @fieldname = 'chassisno'
BEGIN
SELECT * FROM TABLENAME WHERE chassisno=@fieldvalue
END
ELSE IF @fieldname = 'plateno'
BEGIN
SELECT * FROM TABLENAME WHERE plateno=@fieldvalue
END
ELSE IF @fieldname = 'owner'
BEGIN
SELECT * FROM TABLENAME WHERE [owner]=@fieldvalue
END
ELSE IF @fieldname = 'contacttelno'
BEGIN
SELECT * FROM TABLENAME WHERE contacttelno=@fieldvalue
END
ELSE
BEGIN
SELECT * FROM TABLENAME
END
现在如果需要用一句SQL语句就要实现上述逻辑判断并查询结果,大家可能会想到采用如下拼接的方法实现:
DECLARE @sqltext NVARCHAR(2000) SET @sqltext='SELECT * FROM TABLENAME WHERE ' + @fieldname + '=''' + @fieldvalue +''''
EXECUTE (@sqltext)
虽然这样看起来确实能实现逻辑判断并查询结果,但看起来不够直观,修改麻烦且容易出错,而且有一定的局限性,因为这里@fieldname与表字段相同,拼接相对容易些,若不相同的情况下,那就无法实现了,所以我这里采用了另一种方法,效率暂且不说,但绝对简单易用而且够灵活,请看如下SQL语句:
SELECT * FROM TABLENAME a WHERE 1=1 --(如果需要其它条件则用其它条件,否则可以这样或不要,如果不要则下面的第一个AND需去掉)
AND ((@fieldname = 'chassisno' AND a.chassisno=@fieldvalue) OR (@fieldname<>'chassisno') )
AND ((@fieldname = 'plateno' AND a.plateno=@fieldvalue) OR (@fieldname<>'plateno') )
AND ((@fieldname = 'owner' AND a.[owner]=@fieldvalue) OR (@fieldname<>'owner') )
AND ((@fieldname = 'contacttelno' AND b.contacttelno=@fieldvalue) OR (@fieldname<>'contacttelno') )
经验证这条SQL语句可以实现逻辑判断并查询结果,而且就算@fieldname与表字段不相同,我们也可以直接更换相应的字段即可,现在来简要说明一下其原理:
AND ((@fieldname = 'chassisno' AND a.chassisno=@fieldvalue) OR (@fieldname<>'chassisno') )
因为是AND关联,所以后面括号里面的条件是必须满足,又因为括号里面采用了OR关联,所以括号里面的两边的条件是可以符合一个即可的,翻译一下就是,若@fieldname = 'chassisno'时,则要求a.chassisno=@fieldvalue,否则只要@fieldname<>'chassisno'时,则忽略掉前前面的关联条件。注意他们的特点是互斥的,也就是OR两边的条件只能满足其中之一即可,不知道大家明白没有,当然如果有更好的方法或不同的意见欢迎交流,共同进步!
更多IT相关的文章,欢迎光临我的个人网站:http://www.zuowenjun.cn/
SQL语句技巧:查询时巧用OR实现逻辑判断的更多相关文章
- MYSQL SQL语句技巧初探(一)
MYSQL SQL语句技巧初探(一) 本文是我最近了解到的sql某些方法()组合实现一些功能的总结以后还会更新: rand与rand(n)实现提取随机行及order by原理的探讨. Bit_and, ...
- SQL语句关联查询
一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...
- Python与开源GIS:在OGR中使用SQL语句进行查询
摘要: 属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使 ...
- SQL 语句在查询分析器执行很快,程序 Dapper 参数化查询就很慢(parameter-sniffing)
这个问题困扰我好长时间了,使用SQLSERVER 事务探查器找到执行超时的SQL语句,参数查询都是通过执行exe sp_executesql 的存储过程调用,因为它能够分析并缓存查询计划,从而优化查询 ...
- [Beego模型] 四、使用SQL语句进行查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- SQL语句之查询(SELECT)
目录 SQL语句之查询(SELECT) 简单查询 限定查询 模糊查询 排序查询 多表查询 SQL语句之查询(SELECT) SQL是用于访问和处理数据库的标准计算机语言: 中文:结构化查询语言:英文全 ...
随机推荐
- Swift入门篇-基本类型(3)
一:元组 格式 变量或常量关键字 元组变量 = ( 变量,变量, …) 说明: : 元组变量还是一个变量,只不过表现方式和其他变量不一样 :()括号里面可以放入N个变量组成 例子: import Fo ...
- Mac 下配置 SSH 免密码安全登录
Win下个人常使用 SecureCRT ,Mac 下感觉 SecureCRT 并不好使,常用 iTerm2+zsh 搭配使用.A连接B 无密码登陆,则A上面执行 ssh-keygen 一路回车,把 ~ ...
- LeetCode: Path Sum II 解题报告
Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...
- CGI、FastCGI 知识总结
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- UVA12130 Summits(BFS + 贪心)
UVA12130 Summits(BFS + 贪心) 题目链接 题目大意: 给你一个h ∗ w 的矩阵,矩阵的每一个元素都有一个值,代表这个位置的高度. 题目要求你找出这个图中有多少个位置是峰值点.从 ...
- WebService SendTimeout 超时问题
System.TimeoutException: 请求通道在等待 00:01:00 以后答复时超时.增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值.分配给此操作的时间可能是更 ...
- Spring3系列1 -- HelloWord例子
Spring3系列1-HelloWord例子 一. 环境 spring-framework-3.2.4.RELEASE jdk1.7.0_11 Maven3.0.5 eclipse-jee- ...
- 基本的文件 I/O
基本的文件 I/O MSDN 抽象基类 Stream 支持读取和写入字节.Stream 集成了异步支持.其默认实现根据其相应的异步方法来定义同步读取和写入,反之亦然. 所有表示流的类都是从 Strea ...
- 使用git提交内容到网盘
1.创建版本库(注意勾选纯版本库的选项) 2.客户端获取版本库代码 3.提交及获取 master是git默认的主要分支(主干),适合单人独自开发.多人开发时可以给每个人创建一个分支 参考资料: htt ...
- PlayFramework 1.2.x 在Controller 中识别JSON提交
链接 http://stackoverflow.com/questions/6132892/consuming-json-in-play-framework-controller @Global pu ...