具有NULL值

时间:2015-08-31 21:30:56

标签: sql select case openedge progress-db

我很难理解如何在进度案例表达式中检查空值。我想查看列是否存在并使用它,如果不使用回退列。例如,威尔的名字将由比尔在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驱动程序] [OPENEDGE]语法错误SQL语句处于或关于“is null然后”PUB“。”NAME“。”FIRST-“(10713)

如果我选择*我会看到一切。它只是不喜欢null部分。我也可以将when为null时更改为'bob'并且它可以正常工作。

在进度数据库查询中使用空值是否需要做些什么?

2 个答案:

答案 0 :(得分:5)

case语句(case expression when value then result ...)的简写变体是表达式和​​给定值之间一系列相等条件的简写。但是,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" 

答案 1 :(得分:0)

您可以在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"