Не обновлять столбец, если значение обновления равно 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;
Есть ли лучший способ?
Ответы
Ответ 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
...
);