Подтвердить что ты не робот

Не обновлять столбец, если значение обновления равно null

У меня есть такой запрос (в функции):

UPDATE some_table SET
  column_1 = param_1,
  column_2 = param_2,
  column_3 = param_3,
  column_4 = param_4,
  column_5 = param_5
WHERE id = some_id;

Где param_x - параметр моей функции. Есть ли способ НЕ обновлять те столбцы, для которых параметр NULL? Например, если param_4 и param_5 являются NULL, обновите только первые три столбца и оставьте старые значения для column_4 и column_5.

Теперь я делаю это:

SELECT * INTO temp_row FROM some_table WHERE id = some_id;

UPDATE some_table SET
  column_1 = COALESCE(param_1, temp_row.column_1),
  column_2 = COALESCE(param_2, temp_row.column_2),
  column_3 = COALESCE(param_3, temp_row.column_3),
  column_4 = COALESCE(param_4, temp_row.column_4),
  column_5 = COALESCE(param_5, temp_row.column_5)
WHERE id = some_id;

Есть ли лучший способ?

4b9b3361

Ответ 1

Отбросьте инструкцию SELECT, нет необходимости, просто используйте текущее значение:

UPDATE some_table SET
  column_1 = COALESCE(param_1, column_1),
  column_2 = COALESCE(param_2, column_2),
  column_3 = COALESCE(param_3, column_3),
  column_4 = COALESCE(param_4, column_4),
  column_5 = COALESCE(param_5, column_5)
WHERE id = some_id;

Ответ 2

Кроме того, чтобы избежать пустых обновлений:

UPDATE some_table SET
  column_1 = COALESCE(param_1, column_1),
  column_2 = COALESCE(param_2, column_2)
  ...
WHERE id = some_id;
AND  (param_1 IS DISTINCT FROM column_1 OR
      param_2 IS DISTINCT FROM column_2 OR
      ...
     );

Это предполагает, что целевые столбцы должны быть определены как NOT NULL. Иначе, смотрите расширенную версию Geir.

Ответ 3

Аккуратный трюк, спасибо Прземеку, Фрэнку и Эрвину!

Я предлагаю небольшое изменение для ответа Эрвина, чтобы избежать пустых обновлений. Если какие-либо параметры были нулевыми (что означает "использовать старое значение" ), строка обновлялась каждый раз, даже если значения строк не менялись (после первого обновления).

Добавив "param_x IS NOT NULL", мы избегаем пустых обновлений:

UPDATE some_table SET
    column_1 = COALESCE(param_1, column_1),
    column_2 = COALESCE(param_2, column_2),
    ...
WHERE id = some_id
AND  (param_1 IS NOT NULL AND param_1 IS DISTINCT FROM column_1 OR
      param_2 IS NOT NULL AND param_2 IS DISTINCT FROM column_2 OR
     ...
 );