具有空值的CASE表达式

6

我很难理解如何在进度CASE表达式中检查空值。我想查看列是否存在并使用它,如果不存在则使用备用列。例如,名字中的威廉将被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 then “PUB”。”NAME“。”FIRST-”(10713)
如果我执行select *,我可以看到所有内容。只是不喜欢null部分。我也可以将“when is null”更改为“when' bob'”,它可以工作。
使用进展数据库查询中的null值需要进行不同的操作吗?

Case表达式,而非语句... - jarlh
2个回答

10

缩写版的 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" 

对于替换 NULL 值的用例来说,这有点啰嗦:在 PostgreSQL 中,Coalesce() 更符合惯用语。 - David Aldridge
4
进步不是Postgres(指一种开源的关系型数据库管理系统)。 - Tom Bascom
2
似乎Progress也有COALESCE函数,而且更加简洁易懂——特别是当你需要在多个值中“落空”时。详见https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dmsrf%2Fcoalesce.html%23 - gnud

1

在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" 

IFNULL 不是 PostgreSQL SQL 函数。 - David Aldridge
4
@DavidAldridge,这里所说的是进步(Progress),而不是 PostgreSQL。可以参考 http://www.progress4gl.com/ 和 https://en.wikipedia.org/wiki/OpenEdge_Advanced_Business_Language。 - Anup Agrawal
1
IFNULL是由OpenEdge SQL-92引擎支持的ODBC函数,而不是4gl函数或语句。(如果您没有使用ODBC,则还有一个等效的Progress OpenEdge SQL-92扩展:NVL(<expression>,<value>)) - Tom Bascom
感谢@TomBascom,SQLServer中的OPENQuery使用了链接服务器ODBC连接,这可能是IFNULL有效的原因。 - Anup Agrawal
我会使用COALESCE而不是IFNULL。https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dmsrf%2Fcoalesce.html%23 - gnud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接