使用IF CLAUSE或CASE WHEN

时间:2018-07-12 21:32:27

标签: 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 )

此外,在此标志正确之后(并定义了其他两个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子句具有良好的结构,而不是导致错误的原因,但是数据仅是示例数据,仅供测试,不遵循以下声明)

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

谢谢!

1 个答案:

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