关于这个查询,我有以下问题:
可能是重复的:
SQL WHERE子句是否短路评估?
select * from sometable
where 1=1 or (select count(*) from table2 > 0)
如果第一个条件为真(
1=1
),SQL Server 是否仍然执行内部选择?
还是在第一个条件为真时停止执行(像C语言一样)?关于这个查询,我有以下问题:
可能是重复的:
SQL WHERE子句是否短路评估?
select * from sometable
where 1=1 or (select count(*) from table2 > 0)
1=1
),SQL Server 是否仍然执行内部选择?
还是在第一个条件为真时停止执行(像C语言一样)?当(1=1)成立时,它会停止。您可以使用Ctrl-M然后Ctrl-E轻松检查。
考虑以下查询
select * from master..spt_values
where 1=1 or (select count(*) from master..sysobjects) > 0
执行计划仅显示在master..spt_values
中扫描,而在sysobjects
中没有活动。
与C语言相反,当最左边的条件为真时,它不会停止,相反,查询优化器会独立地确定按照给定顺序评估的成本最低的顺序。在常量1 vs 1
的情况下,胜者很明显。
只有因为你比较字面量,它才会被短路。优化器检测到这个琐碎的比较。
但是如果你设置了强制参数化,那么这些字面量将被更改为参数,SQL Server 将处理一个一般情况,每个侧面都可以不同。这需要符合强制参数化的长列表条件...
我要指出的是,如果你说where 1=1或id = 10,你可能会得到不同的结果,我知道我在查询中添加了1=1并得到了不同的结果。在任何情况下都不应该在OR子句中使用1=1。