Sql 使用IF子句或CASE WHEN设置表列

Sql 使用IF子句或CASE WHEN设置表列,sql,if-statement,db2,alter,Sql,If Statement,Db2,Alter,我试图在SQL for DB2中的表中创建一个计算字段。我修改了表格,添加了新字段 alter table edi.base_completeness add AF_flg int 我需要使用基于记录中其他数据的计算值设置此列。具体地说,有以下几点 IF ( [Ship Evnt Cd] is null ) THEN ( 0 ) ELSE IF ( [Ship Evnt Cd] = 'AF' ) THEN ( 1 ) ELSE ( 0 ) 此外,在这个标志确定之后(并定义其

我试图在SQL for DB2中的表中创建一个计算字段。我修改了表格,添加了新字段

alter table edi.base_completeness add AF_flg int
我需要使用基于记录中其他数据的计算值设置此列。具体地说,有以下几点

IF ( [Ship Evnt Cd] is null ) THEN
( 0 )
ELSE IF ( [Ship Evnt Cd] = 'AF' ) THEN 
    ( 1 )
ELSE
    ( 0 )
此外,在这个标志确定之后(并定义其他2个标志,D_flg和X1_flg),我需要使用这些标志的另一个计算字段

alter table edi.base_completeness add test_missing_event varchar(30)
以这种逻辑为基础

IF ( total ([AF_flg] for [Ship_Id], [Carr_Cd]) <> 0 and total ([D_flg] for
[Ship_Id],  [Carr_Cd]) = 0 OR [X1_flg] for [Ship_Id],  [Carr_Cd]) = 0  ) THEN
    (  'Missing Delivery' )
ELSE IF ( total ([AF_flg] for [Ship_Id], [Carr_Cd]) = 0 and total ([D_flg]
 for [Ship_Id],  [Carr_Cd]) <> 0 OR [X1_flg] for [Ship_Id],  [Carr_Cd]) <> 0) THEN
    (  'Missing Pickup' )
ELSE IF ( total ([AF_flg] for [Ship_Id], [Carr_Cd]) = 0 and total ([D_flg]
 for [Ship_Id],  [Carr_Cd]) = 0 OR [X1_flg] for [Ship_Id],  [Carr_Cd]) = 0 ) THEN
    ( 'Missing Both' )
ELSE
    ( 'Not Missed' )
应为“创建变量”,而不是此输入

(我希望CASE子句的结构很好,不是错误的原因,但数据只是为了测试,而不是下面的语句)

这种更新计算列的方法正确吗?应该用触发器来代替吗


谢谢

您使用的是什么版本的Db2?在DB2forLUW中,您的语句给出以下错误

SQL0104N在“PLETENESS SET”之后发现意外标记“CASE”
AF_FLG”。预期的令牌可能包括:“=”。SQLSTATE=42601

添加缺少的
=
应该可以解决您的问题

UPDATE EDI.BASE\u completion SET AF\u FLG=当SHIP\u EVNT\u CD为空时,则0否则1结束

您是要更新字段本身,还是要创建(在表中)?这个错误来自其他方面,甚至忽略了P.Vernon指出的语法错误。他事先创建了这个列。然后尝试更新它。在我创建表时不知道如何设置它。弗农是对的,显然我只是错过了=的标志。谢谢我怎么能看不到丢失的标志…我的坏…非常感谢!
UPDATE EDI.BASE_COMPLETENESS SET AF_FLG CASE WHEN SHIP_EVNT_CD IS NULL THEN 0 ELSE 1 END;