【发布时间】:2018-10-15 16:17:52
【问题描述】:
我试图理解 concat() 和 || 之间的区别在使用空值时在 postgres 中。为什么concat()两边都是空的,concat()返回一个空字符串?
以这个查询为例:
SELECT concat(NULL,NULL) AS null_concat, NULL||NULL AS null_pipes,
concat(NULL,NULL) IS NULL is_concat_null, NULL||NULL IS NULL is_pipe_null
将返回:
我知道 concat() 会忽略空值,但是如果 concat 中的所有值都为空,那么预期的结果不会是空吗?这是 postgres 中所有函数的典型行为吗?我在有关此场景的文档中找不到任何内容。
编辑:
我认为这可能是任何字符串函数的预期结果,但似乎并非如此。如果传递了空值,upper() 和 left() 都会返回空值:
SELECT concat(NULL), NULL||NULL, UPPER(null), left(NULL,1)
结果:
【问题讨论】:
-
CONCAT背后的想法不是仅仅因为连接部分之一为空就使字符串为空。所以空值不会使结果为空;你仍然得到一个字符串。哪个是空的。到目前为止的争论:-) 不过我同意这有点出乎意料,应该在文档中明确提及。 -
看来
concat的行为类似于聚合函数(例如SUM如何忽略NULLs)。另外,请注意,在文档中,concat和concat_ws是唯一声明:“NULL arguments are ignored”的函数。所以我认为默认行为是 NULL 胜过(这反映了 SQL 标准)。
标签: sql postgresql