如果是,请问如何实现类似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'对应的信息
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
我觉得你理解错了,之所以查出了“218011000834”,只是因为他排在前面(218011000834对应的code是不是比214040200346对应的code小?),把“top 1”去掉估计就都出来了。和短路没关系。
另外,个人认为你写的sql有问题,加了“1=1”后所有的行均满足条件了,你再加"FullName_CN like '%W%' "已经不起任何作用了。
没有说按照第二个条件来判断的说法的
当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是只取查询出来的信息的第一条信息,所以你才只看到了一条信息,其他匹配到的没看到
or 正常点的解析 第一个为true 都不会 去处理第二个条件,因为纯粹是浪费cpu时间。
你这么写和下面的写法是一样的结果
select top 1 * from dbo.BAS_Material_YnDyeFab where Guid in
(
'218011000834',
'214040200346'
) order by Code asc