我正在使用Greenplum(基于PostgreSQL 8.2.15)和我的更新命令:
update table01
set logit=
case
when sex = '03' then
logit+0.5*0.8
when sex = '@0' then
logit+0.5*0.2
when sex = '02' then
logit+0.5*0.4
when sex = 'N' then
logit+0.5*(-1.6)
when sex = '01' then
logit+0.5*(-0.4)
end;
它给了我一个错误:
列中的空值" logit"违反非空约束
"logit"
列类型是双精度,除非sex = 'N'
没有返回任何行,否则其他条件都有。
我已经检查了其他有关此错误的答案但尚未获得帮助。为什么会发生这种情况以及如何解决?
答案 0 :(得分:1)
您CASE
expression中没有ELSE
分支来捕获其他内容。缺少时默认为NULL。
将ELSE
分支添加到CASE
以修复它。
或者WHERE
的{{1}}子句只更新不会变为NULL的行。
答案 1 :(得分:0)
您希望将update
设置为与具有值的case
语句匹配:
update table01
set logit = (case when sex = '03' then logit+0.5*0.8
when sex = '@0' then logit+0.5*0.2
when sex = '02' then logit+0.5*0.4
when sex = 'N' then logit+0.5*(-1.6)
when sex = '01' then logit+0.5*(-0.4)
end)
where sex in ('03', '@0', '02', 'N', '1');
或者,您可以在set
:
update table01
set logit = (case when sex = '03' then logit+0.5*0.8
when sex = '@0' then logit+0.5*0.2
when sex = '02' then logit+0.5*0.4
when sex = 'N' then logit+0.5*(-1.6)
when sex = '01' then logit+0.5*(-0.4)
else logic
end);
第一个版本效率更高。第二个更容易维护。