SQL Server 2008合并语句多个匹配条件

时间:2016-07-25 18:10:20

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

我试图以增量方式引入声明数据。我在Systemvarchar)和ClaimNumvarchar)上匹配源和目标,并使用其他列的哈希来检查更改。

我有我的合并声明(简化):

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上使用。

1 个答案:

答案 0 :(得分:1)

您可以使用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一起使用。