SQL WHERE 子句评估:短路解释
关于 SQL 的 WHERE
子句的一个常见问题涉及布尔表达式求值:SQL 是否采用短路求值? 这意味着一旦结果确定,计算就会停止,可能会绕过表达式的后面部分。
ANSI SQL 标准和评估顺序
ANSI SQL 标准没有明确定义 WHERE
子句的短路计算。 ANSI SQL Draft 2003 指定表达式求值顺序取决于实现。 这就将是否实施短路的决定权留给了各个数据库供应商。
特定于数据库的实现
因此,不同数据库系统的短路行为差异很大:
AND
和 OR
运算符的短路评估。OPTIMIZER_MODE
提示启用它。AND
运算符的短路评估。说明性示例
考虑这个查询:
SELECT * FROM Table t WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)
如果 @key
为 NULL
,则第一个条件 (@key IS NULL
) 为 TRUE
。 在 SQL Server 中,短路评估将跳过第二个条件 (@key IS NOT NULL AND @key = t.Key
),因为总体结果已经已知。
要点
ANSI SQL 标准不保证 WHERE
子句中的短路计算。 它的存在和行为是特定于数据库的。 请务必查阅数据库系统的文档以了解其评估策略。
以上是SQL 是否保证 WHERE 子句中的短路计算?的详细内容。更多信息请关注PHP中文网其他相关文章!