列中的空值" logit"违反非空约束

时间:2018-02-09 02:12:30

标签: sql case sqldatatypes greenplum

我正在使用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'没有返回任何行,否则其他条件都有。

我已经检查了其他有关此错误的答案但尚未获得帮助。为什么会发生这种情况以及如何解决?

2 个答案:

答案 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);

第一个版本效率更高。第二个更容易维护。