在Apache Calcite上运行SELECT COALESCE(NULL, NULL);
时,我看到一条错误消息
ELSE子句或至少一个THEN子句必须为非NULL
之所以会这样,是因为COALESCE
函数被转换为CASE
表达式,并且为至少一个THEN
或ELSE
操作数不为null验证了后者。如果全部为NULL
,则引发错误。这是由于源代码中的a comment中描述的原因所致:
根据sql标准,我们不能拥有所有的THEN语句,并且ELSE返回null
要注意的一件事是,当任何参数被显式转换时,该查询返回NULL
,例如SELECT COALESCE(CAST(NULL AS VARCHAR), NULL);
。
但是我在任何地方都找不到。我发现的是following(请参阅“应对null的缩写” 部分,重点是我的):
Coalesce返回第一个非空参数(;如果所有参数均为空,则为null )。
以上提供的该声明似乎符合Oracle和PostreSQL文档。
我的问题是,包含文字COALESCE
的{{1}}仅应按照SQL标准工作吗?
答案 0 :(得分:1)
这个评论太长了。
任何内容是否仅应根据SQL标准工作可能是学术争论的问题,但这不是数据库如何工作。就我所知,每个数据库都有该标准的怪癖,扩展和例外。这完全是由不同的供应商提供这种语言的事实。
在大多数语言中,我认为未键入的NULL
会以默认类型结尾。我通过将select NULL
保存到表中(使用该数据库使用的任何方法)并查看类型来确定它是什么。