首页 新闻 会员 周边 捐助

SqlServer的or条件,当or的左右两端条件都为true时,是根据第二条件来判断的吗?

0
悬赏园豆:50 [已解决问题] 解决于 2019-09-03 11:07

如果是,请问如何实现类似C#/Java的短路判断,即第一条件满足后就按照第一条件来查询

select top 1 * from dbo.BAS_Material_YnDyeFab where Guid in
(
'218011000834',
'214040200346'
) and (FullName_CN like '%W%' or 1 = 1) order by Code asc

其中'214040200346'是满足FullName_CN like '%W%'这个条件的,但是Sql实际应该是按照1=1这个条件来的,导致最后的结果是'218011000834'对应的信息

0==1&1==0的主页 0==1&1==0 | 初学一级 | 园豆:79
提问于:2019-06-27 16:25
< >
分享
最佳答案
0

or本来就是两边都需要满足,这样的写法本身就存在问题,如果实在需要写可以参考我写的这个,判断处根据需求修改

DECLARE @count INT
DECLARE @count2 INT
SELECT top 1 @count=COUNT() FROM dbo.BAS_Material_YnDyeFab where Guid in WHERE CusCode IN
(
'218011000834',
'214040200346'
) AND FullName_CN like '%W%' order by Code ASC
SELECT top 1 @count2=COUNT(
) FROM dbo.tblApplicationAcceptance WHERE CusCode IN
(
'218011000834',
'214040200346'
) AND (FullName_CN NOT LIKE '%W%' AND 1=1) order by Code asc

BEGIN
IF(@count>0)
BEGIN
SELECT top 1 * FROM dbo.BAS_Material_YnDyeFab where Guid in WHERE CusCode IN
(
'218011000834',
'214040200346'
) AND FullName_CN like '%W%' order by Code ASC
END
ELSE IF(@count2>0)
BEGIN
SELECT top 1* FROM dbo.tblApplicationAcceptance WHERE CusCode IN
(
'218011000834',
'214040200346'
) AND (FullName_CN NOT LIKE '%W%' AND 1=1) order by Code asc

end

end

收获园豆:50
熊泽-学习中的苦与乐 | 老鸟四级 |园豆:2272 | 2019-06-27 16:52
其他回答(4)
2

我觉得你理解错了,之所以查出了“218011000834”,只是因为他排在前面(218011000834对应的code是不是比214040200346对应的code小?),把“top 1”去掉估计就都出来了。和短路没关系。

另外,个人认为你写的sql有问题,加了“1=1”后所有的行均满足条件了,你再加"FullName_CN like '%W%' "已经不起任何作用了。

会长 | 园豆:12463 (专家六级) | 2019-06-27 16:47
0

没有说按照第二个条件来判断的说法的
当or的左右两端条件都为true时,那整个判断条件(也就是你括号括起来的语句)为true
ture or true => true;
true or false =>true;
false or true => true;
false or false => false;

or语法就是指or左右两个条件中只要有一个条件为true,那就是true
所以 (FullName_CN like '%W%' or 1 = 1) 中1=1是true的,不管你FullName_CN like '%W%'是否为true,这个判断语句 (FullName_CN like '%W%' or 1 = 1) 都是true的。

top 1是只取查询出来的信息的第一条信息,所以你才只看到了一条信息,其他匹配到的没看到

海之殇 | 园豆:500 (菜鸟二级) | 2019-06-27 17:39
0

or 正常点的解析 第一个为true 都不会 去处理第二个条件,因为纯粹是浪费cpu时间。

花飘水流兮 | 园豆:13615 (专家六级) | 2019-06-28 11:41
0

你这么写和下面的写法是一样的结果
select top 1 * from dbo.BAS_Material_YnDyeFab where Guid in
(
'218011000834',
'214040200346'
) order by Code asc

爱编程的大叔 | 园豆:30844 (高人七级) | 2019-06-29 12:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册