仅将 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
表达式,并且后者被验证是否至少有一个 THEN
或 ELSE
操作数不为空。如果都是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 文档一致。
我的问题是,包含文字 NULL
的 COALESCE
应该只按照 SQL 标准工作吗?
是否 任何东西 都应该只根据 SQL 标准工作可能是一个学术争论的问题,但这不是数据库的工作方式。据我所知,每个数据库都有标准的怪癖、扩展和例外。这只是让不同的供应商提供这种语言的事实。
在大多数语言中,我认为无类型的 NULL
以默认类型结束。我通过将 select NULL
保存到 table(使用该数据库使用的任何方法)并查看类型来确定它是什么。
在 Apache Calcite 上运行 SELECT COALESCE(NULL, NULL);
时,我收到一条错误消息,提示
ELSE clause or at least one THEN clause must be non-NULL
发生这种情况是因为 COALESCE
函数被转换为 CASE
表达式,并且后者被验证是否至少有一个 THEN
或 ELSE
操作数不为空。如果都是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 文档一致。
我的问题是,包含文字 NULL
的 COALESCE
应该只按照 SQL 标准工作吗?
是否 任何东西 都应该只根据 SQL 标准工作可能是一个学术争论的问题,但这不是数据库的工作方式。据我所知,每个数据库都有标准的怪癖、扩展和例外。这只是让不同的供应商提供这种语言的事实。
在大多数语言中,我认为无类型的 NULL
以默认类型结束。我通过将 select NULL
保存到 table(使用该数据库使用的任何方法)并查看类型来确定它是什么。