SQL WHERE 子句:短路评估 – 神话还是现实?
SQL 的 WHERE
子句涉及布尔表达式求值。 问题来了:它是否会采用短路,一旦结果确定就停止评估?这会显着影响查询优化和性能。
短路:有保证还是系统特定?
ANSI SQL 2003 标准指示 WHERE
子句表达式的一般从左到右的求值顺序。 但是,它明确指出实际评估顺序取决于实现。 每个数据库管理系统 (DBMS) 都有自己的布尔表达式求值优化策略。
DBMS 特定行为
不同的数据库系统对此的处理方式不同:
说明性示例
考虑这个WHERE
子句:
<code class="language-sql">SELECT * FROM Table t WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)</code>
如果 @key
为 NULL
,则第一个条件 (@key IS NULL
) 为真。 ANSI 标准将第二个条件 (@key IS NOT NULL AND @key = t.Key
) 的评估留给 DBMS。
结论: SQL WHERE
子句中短路的存在和行为尚未标准化。 依赖它的正确性是有风险的。开发人员必须查阅其特定的 DBMS 文档并进行实证测试以确定实际的评估行为。
以上是SQL的WHERE子句能保证短路评估吗?的详细内容。更多信息请关注PHP中文网其他相关文章!