以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 转:or和and的优先级分析 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=30113) |
-- 作者:temblar -- 发布时间:2013/3/21 11:13:00 -- 转:or和and的优先级分析 帮助里关于 and 跟 or 联用的介绍我只找到1句话,看似明白,可是用的时候总犯糊涂,转篇文章给跟我一样的菜鸟解解惑。(可以结合http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=29327) 原来一直都没有搞清楚sqlserver中and和or的优先级关系,以为他们的优先级都是一样,在执行的时候按出现的顺序从左到右执行。但今天我在写一个约束,如下: (number >0 and prenumber >0) or (number<0 and prenumber<0) 保存后系统总是自动将我的约束修改如下: number >0 and prenumber >0 or number<0 and prenumber<0 就是去掉了我的括号,我想,怎么会这样呢?这样不就改变了我的语意了吗?呵呵,查询资料后得知,原来,上面两个约束的意思是一样的。 原因:在SqlServer中,and的优先级比or的优先级要高。所在,在上面的约束中,会先执行or两边的and条件,再执行or条件。 下面,我们可以做一个测试。 创建表及数据如下: if (object_id(\'table1\') is not null) begin drop table table1 end go create table table1 ( ID int identity(1,1) primary key, num1 int not null, num2 int not null ) insert into table1(num1,num2) select -1,-1 union all select -1,2 union all select 1,2 union all select 0,0 然后我们执行sql select * from table1 where num1 >0 or num2 >0 and num1<0 如果or与and的优先级是一样的话,那么应该只能查出一条数据,即 ID num1 num2 2 -1 2 但实际上,我们执行后发现,这有查出两条数据了, ID num1 num2 2 -1 2 3 1 2 这是因为它先执行了and的条件,再执行or的条件,即等同如下: select * from table1 where num1 >0 or (num2 >0 and num1<0) 那么,如果我们一定要sql先执行or条件,就要使用()来改变条件的执行顺序了。还是上面的sql,如果我们要先执行or条件,可以修改sql如下: select * from table1 where (num1 >0 or num2 >0) and num1<0
[此贴子已经被作者于2013-3-21 11:17:23编辑过]
|
-- 作者:狐狸爸爸 -- 发布时间:2013/3/21 11:17:00 -- 呵呵,个人建议,搞不清楚就用括号,我就一直搞不清楚and和or谁优先(印象中似乎是and),因为我从不吝啬括号。
|
-- 作者:temblar -- 发布时间:2013/3/21 11:19:00 -- http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=29327 这个帖子里的例子不能加括号,不弄明白没法用啊 |
-- 作者:程兴刚 -- 发布时间:2013/3/21 11:43:00 -- and 优先,因为他继承前面的条件的执行顺序!
比如:
if a+b =2 and b=1 or a+b> 5 or a>2 将and 和or 处断开,判断顺序为: 1……1……2……3 if a+b =2 or b=1 or a+b> 5 or a>2 将and 和or 处断开,顺序为: 1……2……3……4 if a+b =2 and b=1 or a+b> 5 and a>2 将and 和or 处断开,顺序为: 1……1……2……2 if a+b =2 or b=1 or a+b> 5 and a>2 将and 和or 处断开,顺序为: 1……2……3……3
这样看就简单明了了!
[此贴子已经被作者于2013-3-21 11:49:14编辑过]
|