仅将COALESCE与无类型的null一起使用时,Apache Calcite引发错误

时间:2019-01-21 11:59:23

标签: sql coalesce apache-calcite

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

  

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

之所以会这样,是因为COALESCE函数被转换为CASE表达式,并且为至少一个THENELSE操作数不为null验证了后者。如果全部为NULL,则引发错误。这是由于源代码中的a comment中描述的原因所致:

  

根据sql标准,我们不能拥有所有的THEN语句,并且ELSE返回null

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

但是我在任何地方都找不到。我发现的是following(请参阅“应对null的缩写” 部分,重点是我的):

  

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

以上提供的该声明似乎符合OraclePostreSQL文档。

我的问题是,包含文字COALESCE的{​​{1}}仅应按照SQL标准工作吗?

1 个答案:

答案 0 :(得分:1)

这个评论太长了。

任何内容是否仅应根据SQL标准工作可能是学术争论的问题,但这不是数据库如何工作。就我所知,每个数据库都有该标准的怪癖,扩展和例外。这完全是由不同的供应商提供这种语言的事实。

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