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

标签 sql sql-server database tsql merge

如果我在 MERGE 语句中有多个 WHEN MATCHED 语句,如果它们为真,它们是否都执行?

我的例子:

DECLARE @X bit = NULL;

--skipping the MERGE statement, straight to WHEN MATCHED

WHEN MATCHED AND A = 1
    @X = 0;
WHEN MATCHED AND B = 1
    @X = 1;

在 4 种可能性中,X 的状态分别是什么?

A|B|X
0|0|?
0|1|?
1|0|?
1|1|?

基本上,我很好奇每个 WHEN MATCHED 子句后是否有隐式 BREAK。

最佳答案

要回答您的问题,是的,它只会运行一场比赛然后中断。但是,如果您希望在更新中有允许条件匹配的逻辑,CASE 语句对此非常有用。

举个例子:

MERGE INTO YourTable
USING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL))
       T2 (a2,b2,c2)
ON a = a2 AND b = b2
WHEN MATCHED  THEN
    UPDATE SET c = 
      CASE 
        WHEN a = 1 THEN 0
        WHEN b = 1 THEN 1
        ELSE NULL
      END        
WHEN NOT MATCHED THEN
    INSERT (a, b) VALUES (a2, b2);

SELECT * FROM YourTable ORDER BY a,b;

结果:

A   B   C
--------------
0   0   (null)
0   1   1
1   0   0
1   1   0

关于sql - 当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847650/

相关文章:

mysql - 如何使用不同文件中的数据构建表?

sql - IBM SQL Query 如何知道我在 CSV 文件中使用的模式?

.net - 在复制环境中将CLR UDF部署到SQL Server 2008?

mysql - 主键和外键相同 MySQL 显示异常

sql - Oracle 相当于 T-SQL SET @var = @var + ' ' ;

sql - 为什么我在 "alter"处或附近收到语法错误?

mysql - 弄清楚如何使用 sql 列别名

Sql - 如何搜索具有两个特定变量的不同行

javascript - 如何对具有多个条件的多列求和并显示在一个列中

mysql - mysql中的累计公式