我想咨询SQL Server OR短路
代码:
DECLARE @tempTable table
(
id int
)
INSERT @tempTable(id) values(1)
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
为什么呢? 1 = 1且@ id ='x'为真。
SQL Server OR运算符:是否有短路功能?
感谢
答案 0 :(得分:14)
在SQL中,没有要求 OR子句提前中断。换句话说,由优化器决定是否同时检查两个条件。我不是MSSQL优化器的专家,但我已经看到优化器已经并且没有将OR子句短路的实例。
答案 1 :(得分:5)
只是偶然发现了这个问题,并且已经找到了这个博客条目:http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
SQL服务器可以在任何它认为合适的地方自由地优化查询,因此在博客文章中给出的示例中,您不能依赖于短路。
然而,CASE显然是以书面形式进行评估 - 检查该博客文章的评论。
答案 2 :(得分:-3)
很明显,MS Sql server支持短路理论,通过避免不必要的检查来提高性能,
支持示例:
SELECT 'TEST'
WHERE 1 = 'A'
SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'
这里,第一个例子会导致错误'将varchar值'A'转换为数据类型int时转换失败。'
虽然第二个条件很容易运行,因为条件1 = 1被评估为TRUE,因此第二个条件根本没有运行。
更多
SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'
这里第一个条件将评估为false,因此DBMS将进入第二个条件,您将再次获得转换错误,如上例所示。
注意:我的错误条件只是为了实现天气条件的执行或短暂的循环 如果错误中的查询结果表示执行的条件,其他方式是短暂的。
简单说明
考虑,
WHERE 1 = 1 OR 2 = 2
因为第一个条件是评估为 TRUE ,评估第二个条件是没有意义的,因为它的评估无论什么价值 根本不会影响结果,因此Sql Server有机会通过跳过不必要的条件检查或评估来节省查询执行时间。
如果“或”如果第一个条件被评估为 TRUE ,那么由“OR”连接的整个链将被视为已评估为如果不评估其他人,则为真。
condition1 OR condition2 OR ..... OR conditionN
如果条件1被评估为真,则休息所有条件,直到条件N被跳过。 在确定第一个 TRUE 的广义词中,将跳过由OR链接的所有其他条件。
考虑第二个条件
WHERE 1 = 0 AND 1 = 1
因为第一个条件是被评估为 FALSE ,评估第二个条件毫无意义,因为它的评估无论什么价值 根本不会影响结果,所以再次为Sql Server提供了通过跳过不必要的条件检查或评估来节省查询执行时间的好机会。
如果“AND”如果第一个条件评估为 FALSE ,则与“AND”相关的整个链将被视为已评估没有评估他人就错了。
condition1 AND condition2 AND ..... conditionN
如果条件1被评估为 FALSE ,则休息所有条件,直到 conditionN 被跳过。 在确定第一个 FALSE 的广义词汇中,将跳过由 AND 链接的所有其他条件。
因此,一个聪明的程序员应该总是按照这样的方式编写条件链,这种方式很少,或者最消极的条件得到评估, 或以这种方式安排可以获得最佳短路效果的条件
谢谢和问候,
<强> Rk_Hirpara 强>