如果更新值为null,请不要更新列

Prz*_*mek 41 sql postgresql null sql-update

我有这样的查询(在函数中):

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;
Run Code Online (Sandbox Code Playgroud)

param_x我的函数的参数在哪里.有没有办法不更新那些param的列NULL?例如-如果param_4param_5NULL,然后只更新前三列,离开旧值column_4column_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;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Fra*_*ens 66

删除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;
Run Code Online (Sandbox Code Playgroud)


Gei*_*tad 14

干得好,谢谢Przemek,Frank&Erwin!

我建议对Erwin的答案进行一次小编辑,以避免空的更新.如果任何参数为null(意思是:"使用旧值"),则每次更新行,即使行值未更改(在第一次更新之后).

通过添加"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
     ...
 );
Run Code Online (Sandbox Code Playgroud)

  • 对,那就更好了.如果所有涉及的列都定义为"NOT NULL",那么我的版本已经在参数中覆盖了NULL.对于OP不允许UPDATE中的新NULL值的情况,情况并非不太可能. (4认同)

Erw*_*ter 13

此外,要避免更新:

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
      ...
     );
Run Code Online (Sandbox Code Playgroud)