如果MERGE语句中有多个WHEN匹配语句,如果它们为真,它们是否都会执行?

我的例子是:

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子句之后是否有隐式中断.

推荐答案

回答您的问题,是的,它将只运行一次匹配,然后中断.但是,如果您希望在更新中具有允许条件匹配的逻辑,则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

Database相关问答推荐

Oracle批量数据处理

Sequel Pro / MAMP 在哪里存储本地数据库?

java嵌入式库磁盘键值数据库

如何在 Big Data 中进行模糊搜索

发布 Oracle 和 SQL Server 性能测试是否违反许可?

仅对表中的一列授予更改

为什么面向对象的数据库还没有成功?

NOSQL 非规范化数据模型

哪个本地数据库适合 Windows 8 应用store 应用?

在 Oracle 的 Check 语句中使用子查询

Neo4j:逐步创建自动索引

是否有任何数据库支持自动索引创建?

对于 Postgres (Windows),有没有像 TOAD 一样好的东西?

在 MySQL 存储过程中使用if和else

如何在 PostgreSQL 事务中获得实时?

如何处理数据库中用户的身份验证/授权?

在连接表中,Rails 缺少组合键的最佳解决方法是什么?

Data Mapper 是不是比 Active Record 更现代的趋势

用于 sql 表中的状态列的类型

PostgreSQL 中的最大事务大小