仅将 COALESCE 与未类型化的空值一起使用时,Apache Calcite 会抛出错误

Apache Calcite throws error when using COALESCE with untyped nulls only

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

ELSE clause or at least one THEN clause must be non-NULL

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

according to the sql standard we can not have all of the THEN statements and the ELSE returning null

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

但是我在任何地方都找不到这个。我找到的是following(见'Abbreviations to Cope With null'部分,重点是我的):

Coalesce returns the first not-null parameter (or null, if all parameters are null).

上面提供的这个声明似乎与 Oracle and PostreSQL 文档一致。

我的问题是,包含文字 NULLCOALESCE 应该只按照 SQL 标准工作吗?

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

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