Sql ApacheCalcite在仅将COALESCE与非类型null一起使用时抛出错误

Sql ApacheCalcite在仅将COALESCE与非类型null一起使用时抛出错误,sql,coalesce,apache-calcite,Sql,Coalesce,Apache Calcite,运行时选择COALESCENULL,NULL;在Apache方解石上,我得到一个错误,它告诉我们 ELSE子句或至少一个THEN子句必须为非空 之所以会发生这种情况,是因为合并函数被转换为CASE表达式,并且验证后者是否至少有一个THEN或ELSE操作数不为null。如果全部为空,则抛出错误。这是由源代码中所述的原因引起的: 根据sql标准,我们不能让所有THEN语句和ELSE语句都返回null 需要注意的一点是,当显式强制转换任何参数时,此查询返回NULL,例如,选择COALESCECASTN

运行时选择COALESCENULL,NULL;在Apache方解石上,我得到一个错误,它告诉我们

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

之所以会发生这种情况,是因为合并函数被转换为CASE表达式,并且验证后者是否至少有一个THEN或ELSE操作数不为null。如果全部为空,则抛出错误。这是由源代码中所述的原因引起的:

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

需要注意的一点是,当显式强制转换任何参数时,此查询返回NULL,例如,选择COALESCECASTNULL作为VARCHAR,NULL

然而,我在任何地方都找不到这个。我发现的是“处理空值的缩写”部分,重点是我的:

Coalesce返回第一个not null参数,如果所有参数都为null,则返回null

上述声明似乎与和文件一致


我的问题是,包含文本null的联合是否应该只按照SQL标准工作?

这对于注释来说太长了

是否任何东西都应该只根据SQL标准工作可能是一个学术争论的问题,但这并不是数据库如何工作的问题。据我所知,每一个数据库都有其特殊性、扩展性和标准的例外情况。这就是不同供应商提供这种语言的事实

在大多数语言中,我认为一个非类型化的NULL以一个默认类型结束。我通过使用数据库使用的任何方法将selectnull保存到表中并查看类型来确定它是什么