Sql 列“中的空值”;罗吉特;违反非空约束
我正在使用Greenplum(基于PostgreSQL 8.2.15)和我的更新命令:Sql 列“中的空值”;罗吉特;违反非空约束,sql,case,sqldatatypes,greenplum,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*(-
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”列中的null值违反NOTNULL约束
“logit”
列类型是双精度的,除sex='N'
不返回行外,其他条件都有行
我已经检查了其他关于这个错误的答案,但是还没有得到帮助。为什么会发生这种情况,以及如何修复它?您没有任何可以捕获其他一切的
分支。缺少时默认为NULL
将ELSE
分支添加到CASE
以修复它。
或者将WHERE
子句添加到UPDATE
中,以仅更新不会变为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');
或者,您可以在集中显式保持值相同:
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);
第一个版本更有效。第二种更容易维持。撇开它不说,绿梅根本就不是一种落后。