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

Null value in column "logit" violates not-null constraint

我正在使用 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;

它给我一个错误:

null value in column "logit" violates not-null constraint

"logit"列类型为双精度,除sex = 'N'returns无行外,其他条件有。

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

CASE expression 没有 ELSE 分支来捕捉其他一切。缺失时默认为NULL。

ELSE 分支添加到 CASE 以修复它。
或者 UPDATEWHERE 子句只更新不会变为 NULL 的行。

您想要设置 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);

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