Как обновить выборочные поля в SQL (оставив некоторые без изменений)? - PullRequest
3 голосов
/ 05 июня 2010

Я хотел бы обновить запись с двумя датами, оставив существующие данные без изменений, если у меня нет нового значения для обновления.

Вот пример записи таблицы:

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

И запрос, который я использую:

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

Если мои обнуляемые даты и времени LastFoo или LastBar равны нулю, я хотел бы оставить существующее значение SQL как есть, в противном случае обновить.

Например, скажем, я обновляю эту запись следующими значениями (это C #, но применяется любой язык):

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

Я бы хотел, чтобы запись была:

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

Я понимаю, что могу изменить свой текст запроса, чтобы пропустить второй столбец, если значение равно нулю, но мне было интересно, есть ли способ оставить запрос как есть и указать, что я не изменяю указанный столбец.

Ответы [ 4 ]

9 голосов
/ 05 июня 2010

Попробуйте

UPDATE sampledates
SET last_foo = COALESCE(@LastFoo,last_foo ), 
last_bar = COALESCE(@LastBar,last_bar )
WHERE id = @ID;
6 голосов
/ 05 июня 2010

Вы можете использовать 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 голосов
/ 05 июня 2010

Попробуйте (это не проверено, у меня сейчас нет 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;
1 голос
/ 05 июня 2010

Вы можете попробовать что-то вроде

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;
...