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_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;
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)
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)
归档时间: |
|
查看次数: |
17488 次 |
最近记录: |