【问题标题】:How do I update selective fields in SQL (leaving some unchanged)?如何更新 SQL 中的选择性字段(保留一些不变)?
【发布时间】:2010-06-04 21:43:35
【问题描述】:

我想用两个日期更新一条记录,如果我没有要更新的新值,则保持现有数据不变。

这是一个示例表记录:

id  last_foo    last_bar
--  ----------  ----------
 1  2010-05-30  2010-05-30

我正在使用的查询:

UPDATE sampledates
   SET last_foo = @LastFoo, 
       last_bar = @LastBar
 WHERE id = @ID;

如果我的可空日期时间 LastFooLastBar 为空,我想保持现有 SQL 值不变,否则更新。

例如,假设我正在使用以下值更新此记录(这是 C#,但任何语言都适用):

DateTime? LastFoo = new DateTime('2010-06-04');
DateTime? LastBar = null;

我希望记录是:

id  last_foo    last_bar
--  ----------  ----------
 1  2010-06-04  2010-05-30

我意识到如果值为空,我可以更改我的查询文本以省略第二列,但我想知道是否有一种方法可以让查询保持原样并指定我不更改指定的列。

【问题讨论】:

  • 我查看了stackoverflow.com/questions/1637901/…,但并不完全相同。
  • 您使用的是哪个数据库和版本?
  • @Mark:DATETIME 表示 MySQL 或 SQL Server,但提供的所有答案都是不可知的
  • 这是 SQL Server 2008。
  • @OMG Ponies:“提供的所有答案都是不可知的”——不是真的。再检查一遍。 :)

标签: sql tsql parameterized


【解决方案1】:

试试

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo,last_foo ), 
last_bar = COALESCE(@LastBar,last_bar )
WHERE id = @ID;

【讨论】:

    【解决方案2】:

    你可以使用COALESCE:

    UPDATE sampledates
    SET last_foo = COALESCE(@LastFoo, last_foo),
        last_bar = COALESCE(@LastBar, last_bar)
    WHERE id = @ID;
    

    在 SQL Server 中,使用 ISNULL 代替 COALESCE 可以获得轻微的性能提升。

    UPDATE sampledates
    SET last_foo = ISNULL(@LastFoo, last_foo),
        last_bar = ISNULL(@LastBar, last_bar)
    WHERE id = @ID;
    

    【讨论】:

    • 感谢 Mark 的 ISNULL 参考。 SQLMenace 早些时候也有同样的想法,所以我选择了他的答案。
    【解决方案3】:

    试试这个(这是未经测试的,我现在没有可用的 SSMS)

    UPDATE sampledates
       SET last_foo = CASE WHEN @LastFoo IS NULL THEN last_foo ELSE @LastFoo END, 
           last_bar = CASE WHEN @LastBar IS NULL THEN last_foo ELSE @LastBar END
      WHERE id = @ID;
    

    【讨论】:

    • 只是出于好奇,什么更快? COALESCE、ISNULL 还是 CASE 逻辑?
    • ISNULL 最后一次听说。 Coalesce 虽然是 ANSI 标准,但适用于不止一种情况。 ISNULL 只接受一个可以为 null 的参数,coalesce 接受多少就扔多少。
    【解决方案4】:

    你可以试试

    UPDATE sampledates
    SET last_foo = (case when @LastFoo IS NULL then last_foo else @LastFoo end), 
    last_bar = (case when @LastBar IS NULL then last_bar else @LastBar end)
    WHERE id = @ID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-21
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多