【问题标题】:SQL Server 2008 Merge Statement Multiple Match ConditionsSQL Server 2008 合并语句多个匹配条件
【发布时间】:2016-11-29 04:55:52
【问题描述】:

我正在尝试以增量方式引入索赔数据。我正在匹配 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 上使用。

【问题讨论】:

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


    【解决方案1】:

    您可以使用CASE 或IIF(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。

    【讨论】:

    • 感谢您的回复;但是,我有多个受 match 语句影响的列。例如,我需要一个匹配条件的 case 语句,你知道吗?
    • @wk4997 然后您使用多个 case 语句,如果您不想更新它们,只需将它们设置为相同的值 col_name = CASE WHEN condition THEN ... ELSE col_name END 加上您可以为每列设置不同的条件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多