我正在测试一些条件渲染,以查看它在较小的规模上是否表现出预期的效果,然后在较大的表上实现它。
目标是创建一个更新查询,该查询将仅更新用户输入了新数据的列,如果没有数据,则对这些列不执行任何操作
这是我进行测试时的情况。具有空值的行未更新为'newValue'
drop table if exists tester
create table tester (
id serial primary key
val TEXT,
)
insert into tester (val) values (null)
select * from tester
update tester
set val = case
when val = null
then 'newValue'
else val
end;
这是我想要产生的简单示例($ 1是用户输入)
drop table if exists tester
create table tester (
id serial primary key
val TEXT,
)
insert into tester (val) values (null)
select * from tester
update tester
set val = case
when val != $1
then $1
else val end
where id = 1
我希望发生的事情是插入以创建ID为1的行和一个等于空值的val单元格。
然后在更新查询中,我认为更新将检查第1行val中存储的数据是否不等于输入值,如果为true,则将第1行的输入值设置为val
这种逻辑和语法正确吗?如果不是,那是不正确的?谢谢!
答案 0 :(得分:1)
假定用户输入的$1
永远不会为NULL:
update tester
set val = $1
where id = 1
and val <> $1 -- avoid updating with the same value
;
注意:您的:
`case when val != $1 then $1 else val end`
可以简化为:
`case when val <> $1 then $1 else $1 end`
或:
`$1`