如何更新SQL中的选择性字段(保留一些不变)?

JYe*_*ton 3 sql t-sql parameterized

我想用两个日期更新记录,如果我没有要更新的新值,则保留现有数据.

这是一个示例表记录:

id  last_foo    last_bar
--  ----------  ----------
 1  2010-05-30  2010-05-30
Run Code Online (Sandbox Code Playgroud)

我正在使用的查询:

UPDATE sampledates
   SET last_foo = @LastFoo, 
       last_bar = @LastBar
 WHERE id = @ID;
Run Code Online (Sandbox Code Playgroud)

如果我可以为null的日期时间 LastFoo或者LastBar是空的,我想离开现有的SQL值按原样,否则更新.

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

DateTime? LastFoo = new DateTime('2010-06-04');
DateTime? LastBar = null;
Run Code Online (Sandbox Code Playgroud)

我希望记录为:

id  last_foo    last_bar
--  ----------  ----------
 1  2010-06-04  2010-05-30
Run Code Online (Sandbox Code Playgroud)

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

SQL*_*ace 9

尝试

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo,last_foo ), 
last_bar = COALESCE(@LastBar,last_bar )
WHERE id = @ID;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 6

你可以使用COALESCE:

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo, last_foo),
    last_bar = COALESCE(@LastBar, last_bar)
WHERE id = @ID;
Run Code Online (Sandbox Code Playgroud)

在SQL Server中,使用ISNULL而不是COALESCE 可以获得较小的性能提升.

UPDATE sampledates
SET last_foo = ISNULL(@LastFoo, last_foo),
    last_bar = ISNULL(@LastBar, last_bar)
WHERE id = @ID;
Run Code Online (Sandbox Code Playgroud)