在 SQL 中,逻辑运算符“AND”和“OR”是构建条件表达式的基石,这些条件表达式根据指定的条件过滤数据。但是,它们的优先级,或者说它们被评估的顺序,对于确定这些表达式的结果至关重要。
问题:
考虑以下两个 SQL 语句:
<code class="language-sql">SELECT [...] FROM [...] WHERE some_col in (1,2,3,4,5) AND some_other_expr</code>
<code class="language-sql">SELECT [...] FROM [...] WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr</code>
这些语句是否等效?是否有像真值表这样的工具可以帮助验证它们的等效性?
答案:
否,这两个语句不等效。“AND”的优先级高于“OR”,这意味着表达式 some_col in (1,2,3,4,5) AND some_other_expr
首先被评估,然后该评估的结果再应用于 OR 运算符。
为了说明这一点,考虑以下示例:
<code class="language-sql">Declare @x tinyInt = 1 Declare @y tinyInt = 0 Declare @z tinyInt = 0 Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- 输出 T Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- 输出 F</code>
第一个语句评估 @x=1 OR @y=1 And @z=1
,结果为“T”,因为表达式 @y=1 And @z=1
返回“False”。然后,“OR”运算符将此结果与“@x=1”(为“True”)组合,最终输出“T”。
但是,第二个语句对 (@x=1 OR @y=1) And @z=1
的评估方式不同。“OR”运算符首先组合“@x=1”和“@y=1”,它们都为“True”,结果为“True”。然后,这个“True”结果与“@z=1”(为“False”)进行评估,最终输出“F”。
因此,评估顺序很重要,可以使用括号来覆盖优先级规则。为了使这两个语句等效,可以添加括号,如下所示:
<code class="language-sql">SELECT [...] FROM [...] WHERE (some_col in (1,2,3) or some_col in (4,5)) AND some_other_expr</code>
对于那些寻求有关 SQL 中逻辑运算符优先级的更多参考资料的人,建议参考以下资源:
以上是SQL AND/OR 运算符优先级:这些 SQL 语句是否等效?的详细内容。更多信息请关注PHP中文网其他相关文章!