回答

收藏

SQL逻辑运算符优先级:And and Or

技术问答 技术问答 125 人阅读 | 0 人回复 | 2023-09-14

下面的两个语句是否等效?' Z, H7 n1 N! t+ D* V$ z# }' u
SELECT [...]. u& ~0 {, y7 Q
FROM [...]
2 q3 X* T" q2 v0 ~9 wWHERE some_col in (1,2,3,4,5) AND some_other_expr
/ Z7 v# |! R. p$ `: t  S+ V& y8 d* b/ A0 ~4 r7 K; t

: B; g% B2 R' Z  gSELECT [...]
! \) J6 B+ \! fFROM [...]
9 e" Y" {/ p% e# [2 H  RWHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr7 b' r) S4 w: w$ p

, S9 Y( z) k5 p- F我可以使用某种真值表来验证这一点吗?
* O7 ?; |5 Z, Q5 Q               
& F- v1 `8 B( _- S1 h解决方案:
, J, L5 C/ [* w- Z               
5 t. e- O2 P3 o% j+ N( n: v
; ]9 g' v- m- a- f$ y" Q& n0 ?+ v' I; b0 I5 ?7 W% a" E. d" b
                And优先于Or,因此,即使a  a1 Or a2# n3 R1 R$ f# o
Where a And b
; ]: U' `! m7 \0 P! \: y0 ?- Z- d$ a, A: ~8 u+ h
与…不同9 [$ m: F& U8 S$ V0 ^' \$ t: z
Where a1 Or a2 And b,
1 u. ?: o9 ]$ G7 m6 ?+ z- D
" |3 a2 l+ \" b/ r, W  Z因为那将被执行为
6 q( H% e$ y8 t3 L9 mWhere a1 Or (a2 And b)
* T9 C4 s! K9 x2 J. O9 S1 |0 [" G
并且想要使它们相同,是以下内容(使用括号覆盖优先级规则):2 P$ y- X7 l( J$ B5 b8 l- u: H. |
Where (a1 Or a2) And b
7 Y* A+ l- Y5 j, V( w9 U: ?
5 V2 l6 q+ R! y& E这是一个示例说明:& G5 `& L  f5 }1 i
Declare @x tinyInt = 1
% x* D) }  g/ Q2 H0 y& B$ eDeclare @y tinyInt = 0
7 m( S8 @8 }( O7 u! `. LDeclare @z tinyInt = 0: H) m3 Q+ }4 W$ ?. }0 A! r# D# U
Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- outputs T
! f6 h  r9 A( H* ~  U( [1 ~9 NSelect Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则