SELECT * FROM tablename WHERE 条件1 AND 条件2 OR 条件1 AND 条件3 OR 条件1;
我想要WHERE后面的条件按顺序来判断,就是 【条件1 AND 条件2】 若不满足就判断 【条件1 AND 条件3】 再不满足就判断 【条件1】;
可是好像是短路效应似的,它会不按顺序来,若最后一个【条件1】满足了,就不会判断前面两个,相当于前面两个白写了。。。请问怎么才能让者三个【xx】按顺序判断呢?
这个问题我验证了一下是存在的,因为sql的where执行顺序是从右到左的,所以就会先判断后面的条件,要是想按自己的顺序执行的话可以把需要先判断的条件放在后面(即右面)。
可以看一下这篇文章里面的:SQL where 条件顺序对性能的影响有哪些 (里面写的挺清楚的)
http://ljh0721.iteye.com/blog/1974161
条件是按照顺序判断的,如果前面判断为真,后面才会逻辑短路。
使用动态生成sql语句:
if 条件1 AND 条件2 then temp = SELECT * FROM tablename WHERE 条件1 AND 条件2
else
if 条件1 AND 条件3 then temp = SELECT * FROM tablename WHERE 条件1 AND 条件3
end if
像oracle和sqlserver会根据语句进行优化,不一定按照你希望的顺序,如果你想知道记录是哪个条件查出来的,那用union
SELECT tablename.*,'条件1' FROM tablename WHERE 条件1 AND 条件2
union
SELECT tablename.*,'条件2' FROM tablename WHERE 条件1 AND 条件3
union
SELECT tablename.*,'条件3' FROM tablename WHERE 条件1;
根据你的描述,如果确实只需要满足条件1就能查出来,那么前两个条件是不用写的。
如果确实只需要满足条件1就能查出来,那么前两个条件是不用写的。
可是事实上他就是按照这个逻辑进行判断的,最好写成(条件1 AND 条件2) OR (条件1 AND 条件3) OR 条件1
Where 子句适当加上括号,现在这个会产生歧义的。
因为不知道你的条件到底是怎样写的,可以给你提供两种方式,一:声明变量,用if语句判断,例如我之前写过的部分语句
declare @flag indeclare @flag int
declare @fla int
set @flag=(select count(*) from Area where dbo.fn_GetPy(AreaName) like '%'+@str+'%')
set @fla=(select count(*) from Area where dbo.f_GetP(AreaName) like '%'+@str+'%')
if @flag>0
select AreaName from Area where dbo.fn_GetPy(AreaName) like '%'+@str+'%'
else
if @fla>0
select AreaName from Area where dbo.f_GetP(AreaName) like '%'+@str+'%'
else
select AreaName from Area where AreaName like '%'+@str+'%''
第二种
直接用case when 判断 这两种都是按顺序判断的_
就是按照这个逻辑进行判断的,最好写成(条件1 AND 条件2) OR (条件1 AND 条件3) OR 条件1
条件是按照顺序判断的:
如果前面判断为真,后面才会逻辑短路;
如果后边判断为真,前面是的假 又是或关系 当然前边的两个就相等于无用条件了
目前解决了,我把最后的最后的 【条件1】 改为了 【条件1 AND 任意加一个条件】的到了预期的结果,这个执行顺序貌似和条件数量有关,数量一样的条件它才会按顺序来执行,最后,感谢各位的回答!
SELECT tablename.*,'条件1' FROM tablename WHERE 条件1 AND 条件2
union
SELECT tablename.*,'条件2' FROM tablename WHERE 条件1 AND 条件3
union
SELECT tablename.*,'条件3' FROM tablename WHERE 条件1;