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

时间:2010-06-04 21:43:35

标签: sql tsql parameterized

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

以下是样本表记录:

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

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

4 个答案:

答案 0 :(得分:9)

尝试

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

答案 1 :(得分:6)

您可以使用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;

答案 2 :(得分:2)

试试这个(这是未经测试的,我现在没有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;

答案 3 :(得分:1)

您可以尝试类似

的内容
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;