【问题标题】:Merge Statement: Don't update blank field合并语句:不要更新空白字段
【发布时间】:2012-11-07 10:52:09
【问题描述】:

我正在执行从临时表 t 到主表 ts 的 MERGE 语句,匹配 ID 字段。它包含以下内容:

WHEN MATCHED THEN UPDATE
   SET ts.username = t.username, ts.password = t.password, ts.title = t.title, ts.firstname = t.firstname, ts.surname = t.surname, ts.email = t.email

如果临时表t 中的用户名和密码为空,我不想更新主表ts。我该怎么做?

编辑:似乎 CASE 语句或使用 COALESCE(NULLIF(t.username, ''), ts.username) 将起作用。哪个最好?

【问题讨论】:

  • 您可以进行虚拟更新吗? IE。设置 ts.username = coalesce(t.username, ts.username), ...
  • @Frank Schmitt 我从来不知道 COALESCE 函数。如果我将它与 NULLIF 一起使用,我认为就可以了!
  • 实际问题是什么:您想从更新中删除记录吗,因为它总是会更新,即使您将其设置为以前的值。
  • 只是不想用空白值覆盖现有的用户名/密码。感谢 Frank Schmitt 和 Chris Gessler

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


【解决方案1】:

在处理空格(即空字符串)时,然后使用 case 语句

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' then ts.username else t.username end

如果你正在处理 null,那么使用 isnull

WHEN MATCHED THEN UPDATE
   SET ts.username = isnull(t.username, ts.username),

如果它可以是空白或null,则可以在case语句中同时处理

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' or t.username is null then ts.username else t.username end

【讨论】:

  • 感谢 Chris,这行得通,但是我决定改用 ISNULL(NULLIF(t.username, ''), ts.username),因为它比 case 语句更简洁。
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多