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

条件是按照顺序判断的,如果前面判断为真,后面才会逻辑短路。

使用动态生成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;