回答

收藏

当使用多个WHEN MATCHED语句时,它们全部执行还是仅执行一个?

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

如果我在MERGE语句中有多个WHEN MATCHED语句,如果它们是真的,它们是否全部执行?
/ d& u+ A, K; g+ P9 V. ]我的例子:# P2 k7 g- k- X* q0 i
DECLARE @X bit = NULL;0 K# `$ y6 o1 B/ u: _& i# A
--skipping the MERGE statement, straight to WHEN MATCHED
' _4 n8 P3 y, nWHEN MATCHED AND A = 1
  o4 x3 b, P. Q" V    @X = 0;( ]% S  B7 |( b7 F
WHEN MATCHED AND B = 1
& t+ t4 ^, b# l" K    @X = 1;
/ r* ~: u' r* T* |+ ?在这四个可能性中,每个X的状态是什么?
* R! g4 @1 S% `3 A; g8 l+ Y, `6 S, [A|B|X7 k6 T: G4 V, U; U; C7 k6 v
0|0|?6 l/ H: y& t& |6 J6 s' r
0|1|?
6 m; t' e" o) g$ @, U; q6 ?1|0|?
1 K5 K9 e2 U6 `/ v) ~$ I& o1|1|?9 p3 ]2 U' n' C) L( G; }
基本上,我很好奇每个WHEN MATCHED子句之后是否存在隐式BREAK。
9 H+ w" |% m5 E5 z; c, t+ s" Z, m                , @' j, z) T/ @8 |! o/ a
解决方案:" s+ d2 v  j& S+ o/ A# Z% Y/ q
                1 f$ [+ l1 W6 I% w' Y
. |5 Z# _/ \* K4 F6 d7 o
' x3 ]$ ?" ~6 T+ t4 ~5 S! r% `
                要回答您的问题,是的,它将只进行一次比赛然后中断。但是,如果您希望逻辑允许在更新中进行条件匹配,则该CASE语句对此非常有用。
' G  \5 J. c! B5 J" @像这样的例子:
: R! F. h2 d4 I# L. X1 ]8 ^MERGE INTO YourTable
0 X5 o5 \1 E1 u& T) uUSING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL))
& Q% q3 V+ p" h9 c+ G2 I  f- N       T2 (a2,b2,c2)
( Q% y* ?9 _9 X0 g* X- {ON a = a2 AND b = b2" O3 D! z3 C% ?: e, W
WHEN MATCHED  THEN+ J1 i9 d1 e. N" p
    UPDATE SET c = / ~+ T3 H0 N1 u
      CASE
$ c: S4 j  w2 A8 ~" S        WHEN a = 1 THEN 08 F: c; D  d% P6 q5 u" K
        WHEN b = 1 THEN 1
+ }0 z) \5 J+ q& o- I        ELSE NULL
( T( Z$ W9 M  c( S5 C      END        
  n* w- K2 X, V7 L1 e2 ^, _WHEN NOT MATCHED THEN
1 Z0 r+ E' y; B9 G/ O    INSERT (a, b) VALUES (a2, b2);; l" n- n3 N3 O/ v
SELECT * FROM YourTable ORDER BY a,b;$ q& T) \& D8 l, i8 d0 |2 m  A& v
SQL小提琴演示. e( F1 z& A" I  B3 _  A  t
+ J7 Z$ O, r, z6 d7 F9 M
结果:3 Z' C" @2 w" q7 ?# O
A   B   C0 U0 s+ h& Y: W, s0 N
--------------' d' X4 N( u* J! Z: A
0   0   (null)
( H+ ^5 [6 m" e0   1   1
: l, T* T& f, @  m* J/ o) y0 f1   0   01 S8 q1 y7 ?+ N; F2 E* Y- Q) q
1   1   0
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则