具有 NULL 值的 CASE 表达式

CASE expression with NULL value

我很难理解如何检查进度案例表达式中的空值。我想查看一个列是否存在并使用它,如果不存在则使用后备列。例如,William 的名字将被 Bill 改写为 fn.special-char.

我有以下查询:

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   CASE fn."SPECIAL-CHAR"
     WHEN   is null  THEN "PUB"."NAME"."FIRST-NAME"
     ELSE   fn."SPECIAL-CHAR"
END as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID" 

当我 运行 查询时,我得到:

ORBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Syntax error SQL statement at or about "is null then "PUB"."NAME"."FIRST-" (10713)

如果我做 select * 我会看到一切。它只是不喜欢 null 部分。我还可以将 when is null 更改为 when 'bob' 并且它有效。

要在进度数据库查询中使用空值,我需要做些什么不同的事情吗?

您可以使用 Progress 4GL 中的 IFNULL 函数代替 CASE

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   IFNULL(fn."SPECIAL-CHAR", "PUB"."NAME"."FIRST-NAME") as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID" 

case 语句 (case expression when value then result ...) 的 shorthand 变体是 shorthand 表达式和给定值之间的一系列相等条件。但是,null 不是一个值 - 它是缺少值,必须像您尝试的那样使用 is 运算符显式求值。但是,为了正确执行此操作,您需要使用 case 语法的稍长变体 - case when condition then result ...:

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   CASE WHEN fn."SPECIAL-CHAR" IS NULL THEN "PUB"."NAME"."FIRST-NAME"
     ELSE   fn."SPECIAL-CHAR"
END as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID"