我正在尝试在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 )
此外,在此标志正确之后(并定义了其他两个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' )
我试图使用UPDATE ... SET找出代码,然后包括IF或CASE子句,而不是simple =,但是我遇到了错误,期望创建语句而不是假定的代码。
UPDATE EDI.BASE_COMPLETENESS SET AF_FLG CASE WHEN SHIP_EVNT_CD IS NULL THEN 0 ELSE 1 END;
期望“ create_variable”代替此输入
(我希望CASE子句具有良好的结构,而不是导致错误的原因,但是数据仅是示例数据,仅供测试,不遵循以下声明)
这种更新计算列的方法正确吗?应该用触发器代替吗?
谢谢!
答案 0 :(得分:1)
您使用的是哪个版本的Db2?在Db2 for LUW中,您的陈述出现以下错误
SQL0104N An unexpected token "CASE" was found following "PLETENESS SET
AF_FLG". Expected tokens may include: "=". SQLSTATE=42601
添加缺少的=
应该可以解决您的问题。
UPDATE EDI.BASE_COMPLETENESS SET AF_FLG = CASE WHEN SHIP_EVNT_CD IS NULL THEN 0 ELSE 1 END