回答

收藏

是否对SQL WHERE子句进行了短路评估?

技术问答 技术问答 62 人阅读 | 0 人回复 | 2023-09-13

是否在SQL WHERE子句中对布尔表达式进行短路求值 ?
8 z' c; `# r7 |5 A8 K. V例如:$ a$ W4 C. c' P# J( @% p" S( P! M
SELECT *
% |+ a7 M- a0 a$ x$ `; ~* RFROM Table t " y: Y; q' S! Q  a9 @
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)+ I  u$ f: z: V0 g3 n* @1 ^
如果 @key IS NULL的 计算结果为true,则 @key不是NOT AND @key = t.Key的 计算结果吗?
) {( \6 q; Q0 P- M8 `如果否,为什么不呢?! Q1 U9 d7 E# {& x4 D! P
如果是,是否可以保证?它是ANSI SQL的一部分还是特定于数据库的?: c: e" E0 I! g1 U! ^
如果是特定于数据库的SqlServer?甲骨文?MySQL的?. v7 c1 H+ m/ D7 e1 d. @* Y
               
3 Q; O5 Q* j8 N3 r" a8 ?+ q解决方案:
) i) P4 f" w) i: v* q               
) E1 f; ]7 K" J# h& [
1 \, Z0 M6 z3 o$ r$ o7 [/ {: l, S' B
                ANSI SQL草稿2003 5WD-01-Framework-2003-09.pdf$ q7 W1 H6 {+ z6 b

9 }* I/ ?/ k  M9 O5 U! `* C3 t6.3.3.3规则评估顺序0 r1 w$ d* B. d( O1 m
[…]
2 d6 ?- z; H- n8 O  D如果优先级不是由格式或括号确定的,则通常从左到右执行表达式的有效评估。但是, 取决于 表达式是否实际上是从左到右求值,这 取决于实现
& F0 N! f3 B8 N. D4 j# o,特别是在操作数或运算符可能导致条件升高 或是否可以在不完全评估表达式的所有部分的情况下确定表达式的结果时。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则