问题描述
- sql语句的逻辑问题。。。
- 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
解决方案二:
可是事实上他就是按照这个逻辑进行判断的,最好写成(条件1 AND 条件2) OR (条件1 AND 条件3) OR 条件1
解决方案三:
条件是按照顺序判断的,如果前面判断为真,后面才会逻辑短路。
解决方案四:
使用动态生成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 unionSELECT tablename.*'条件2' FROM tablename WHERE 条件1 AND 条件3 unionSELECT tablename.*'条件3' FROM tablename WHERE 条件1;
解决方案六:
根据你的描述,如果确实只需要满足条件1就能查出来,那么前两个条件是不用写的。
解决方案七:
如果确实只需要满足条件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
条件是按照顺序判断的:
如果前面判断为真,后面才会逻辑短路;
如果后边判断为真,前面是的假 又是或关系 当然前边的两个就相等于无用条件了