【问题标题】:Don't update column if update value is null如果更新值为空,则不更新列
【发布时间】:2012-10-29 15:26:26
【问题描述】:

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

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

有没有更好的办法?

【问题讨论】:

  • 我认为这是要走的路。

标签: sql postgresql null sql-update


【解决方案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】:

    另外,为了避免 empty 更新:

    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's extended version

    【讨论】:

      【解决方案3】:

      巧妙的技巧,感谢 Przemek、Frank 和 Erwin!

      我建议对 Erwin 的回答稍作修改以避免空更新。如果任何参数为空(意思是:“使用旧值”),则每次都会更新行,即使行值没有改变(在第一次更新之后)。

      通过添加“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
           ...
       );
      

      【讨论】:

      • 对,那就更好了。如果所有涉及的列都定义了NOT NULL,那么我的版本已经在参数中包含了NULL。对于 OP 不允许在 UPDATE 中使用新的 NULL 值的情况并非不可能。
      猜你喜欢
      • 2018-02-02
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多