SQL Server 2008 Merge 语句多匹配条件

标签 sql sql-server sql-server-2008 tsql merge

我正在尝试以增量方式引入 claim 数据。我在 System 上匹配源和目标( varchar ) 和 ClaimNum ( varchar ),使用其他列的散列来检查更改。

我有我的合并语句(简化):

MERGE target
USING source ON target.System = source.System
             AND target.ClaimNum = source.ClaimNum

WHEN MATCHED AND target.HashValue <> source.HashValue
THEN {update claim record data}

WHEN MATCHED AND target.HashValue = source.HashValue
THEN {update claim record as "checked"}

WHEN NOT MATCHED
THEN {insert new claim record}

但是,我不能有 2 个匹配的条件。我还可以如何使用合并语句完成此操作?

这用于 SQL Server 2008。

最佳答案

您可以使用 CASEIIF (SQL Server 2012) 添加自定义逻辑:

MERGE target
USING source
  ON target.System = source.System
 AND target.ClaimNum = source.ClaimNum
WHEN MATCHED THEN 
   UPDATE SET column_name = 
            CASE WHEN target.HashValue = source.HashValue THEN ...
                 ELSE ...
            END
WHEN NOT MATCHED THEN {insert new claim record}

编辑:

如果只是UPDATE您可以使用多个条件/设置为相同的值来跳过:
...
UPDATE SET column_name1 = 
            CASE WHEN condition1 THEN ...
                 ELSE column_name1
            END
           ,column_name2 = 
             CASE WHEN condition1 THEN ...
                  WHEN condition2 THEN ...
                  ELSE column_name2
             END
           ,...

笔记:

如果源/目标 HashValue可以为空,您应该使用 COALESCE/ISNULL/adding OR target.HashValue IS NULL... 处理它.比较运算符不适用于 NULL .

关于SQL Server 2008 Merge 语句多匹配条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38574695/

相关文章:

SQL查询从表的每条记录生成多条记录

sql-server - Sql Azure 中的大型键值存储

c# - Sql Server 中的 DateTime 插入更改值

c# - EF4.4 中每个具体类型 (TPC) 映射的表

sql - 使用 where 子句在 SQL Server 中进行透视

sql - 在 SQL Server 中通过标准差消除异常值

sql - 将表达式转换为数据类型 int 以进行基本统计时发生算术溢出错误

PHP mySQL 变量访问

php - 检查值是否已存在于行而不是列单元格中

sql - 将 100000 条记录插入 SQL Server 的最快方法