0

SELECT COALESCE(NULL, NULL);Apache Calcite 上运行时,我收到一个错误消息

ELSE 子句或至少一个 THEN 子句必须为非 NULL

发生这种情况是因为COALESCE函数被转换为CASE表达式并且后者被验证是否至少一个THENELSE操作数不为空。如果都是NULL,则抛出错误。这是由源代码中的评论中描述的原因引起的:

根据 sql 标准,我们不能让所有 THEN 语句和 ELSE 返回 null

需要注意的一点是,NULL当显式转换任何参数时,此查询将返回,例如SELECT COALESCE(CAST(NULL AS VARCHAR), NULL);.

但是我无法在任何地方找到这个。我所做的发现如下 (参见“应对 null 的缩写”部分,重点是我的):

Coalesce 返回第一个非空参数(如果所有参数都为空,则返回空)。

上面提供的这个声明似乎符合OraclePostreSQL文档。

我的问题是,COALESCE包含文字NULLs 是否应该仅按照 SQL 标准工作?

4

1 回答 1

1

是否任何东西都应该只根据 SQL 标准工作可能是一个学术争论的问题,但这与数据库的工作方式无关。据我所知,每个数据库都有标准的怪癖、扩展和例外。这就是让不同的供应商提供这种语言的事实。

在大多数语言中,我认为 untypedNULL以默认类型结束。我通过保存select NULL到表中(使用用于该数据库的任何方法)并查看类型来确定它是什么。

于 2019-01-21T12:46:11.440 回答