MERGE - 有条件的“当匹配然后更新”

Posted

技术标签:

【中文标题】MERGE - 有条件的“当匹配然后更新”【英文标题】:MERGE - conditional "WHEN MATCHED THEN UPDATE" 【发布时间】:2012-12-05 03:27:02 【问题描述】:

下图中的高亮部分显示了我想要实现的逻辑。我意识到语法不正确。

有没有办法在 MERGE 语句中仅当目标表中的某一列的值为 NULL 且源表中的相应值不为空时,才有条件地更新记录?

你会如何建议重写这个?

MERGE dbo.input_311 AS [t]
USING dbo.input_311_staging AS [s]
ON ([t].[unique key] = [s].[unique key])
WHEN NOT MATCHED BY TARGET
    THEN INSERT(t.[Created Date]) VALUES(s.[Created Date])
WHEN MATCHED
    THEN UPDATE SET(t.[Created Date] = s.[Created Date]
                WHERE s.[Created Date] IS NOT NULL
                AND t.[Created Date] IS NULL)
OUTPUT deleted.*, $action, inserted.*;
GO

【问题讨论】:

此代码应格式化为代码,而不是图像 【参考方案1】:

您也许可以使用When Matched And (s.[Created Date] Is Not Null And t.[Created Date] Is Null) Then Update ...

【讨论】:

+1,完整示例请参见此处的示例 B:technet.microsoft.com/en-us/library/bb510625.aspx 感谢@Laurence 的回答。 我发布了follow-up question。我做了一个单独的帖子,所以我可以承认这个答案是正确的,以及我下一个问题的答案(如果我有幸得到一个) 更新了来自@JeffOgata 示例的直接链接:docs.microsoft.com/en-us/sql/t-sql/statements/…

以上是关于MERGE - 有条件的“当匹配然后更新”的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件的范围基于多个条件的条件

merge into on条件能有Null判断嘛

Oracle:更新列,如果它不在 Merge 语句的条件下

数据库系列—— merge into用法

MERGE语法详解

merge into语句的使用