【问题标题】:SQL: How do I do an update that will only update the values that aren't null?SQL:如何进行只更新非空值的更新?
【发布时间】:2012-01-17 02:00:15
【问题描述】:

如何运行如下所示的 UPDATE,它只更新不为空的列?

UPDATE Table
   SET Name = @Name,
       Email = @Email,
       Phone = @Phone
 WHERE id = @id

编辑:

因此,如果我使用上述更新但分配了以下内容...

  @Name = Tom
  @Email = NULL
  @Phone = NULL

所以只有姓名会被更新,而电子邮件和电话数据库中的任何内容都将保留在数据库中。

【问题讨论】:

  • 您可以使用case语句来检查是否有空值,如果不为空则返回原始值,如果为空则返回新值。
  • 您的第一个语句与您的最后一个语句不匹配,您是只想在数据库值不为空时更新还是在变量不为空时不更新?
  • 是的,编辑使他的最初问题看起来应该是,“我怎样才能运行像下面这样的更新,它只更新新值不为空的列?”

标签: sql sql-server conditional


【解决方案1】:

这个基本想法应该可行:

UPDATE Table
   SET Name = ISNULL(@Name, Name),
       Email = ISNULL(@Email, Email),
       Phone = ISNULL(@Phone, Phone)
 WHERE id = @id

所以如果@Name 为NULL,Name 不变。如果@Namenot NULL,则将其分配给Name 等...

--- 编辑---

当然@clintp,COALESCE 变体看起来像这样:

UPDATE Table
   SET Name = COALESCE(@Name, Name),
       Email = COALESCE(@Email, Email),
       Phone = COALESCE(@Phone, Phone)
 WHERE id = @id

【讨论】:

  • COALESCE() 也可以使用并且是一个标准。在这种情况下,有一些小的差异并不重要。
【解决方案2】:

如果我正确理解了这个问题:

SET Name = CASE WHEN Name IS NULL THEN NULL ELSE @Name END  ... 

【讨论】:

  • 我相信 OP 意味着当为 parameters 传递 NULL 值时,它们将被忽略。所以稍微交换一下你的案例陈述。 :)
  • @djacobson 你是对的,把它归咎于周五晚上的杜松子酒和滋补品。
  • @djacobson,不过,周六早上我看到 OP 说“只更新不为空的 ”。但不管他的意思是什么,他应该能够利用这里答案中的信息找到解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多