码迷,mamicode.com
首页 > 数据库 > 详细

SQL语句技巧:查询时巧用OR实现逻辑判断

时间:2014-11-26 16:20:50      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   sp   on   div   log   as   

首先看以下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两边的条件只能满足其中之一即可,不知道大家明白没有,当然如果有更好的方法或不同的意见欢迎交流,共同进步!

SQL语句技巧:查询时巧用OR实现逻辑判断

标签:style   blog   ar   color   sp   on   div   log   as   

原文地址:http://www.cnblogs.com/zuowj/p/4123207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!