我正在尝试理解在Postgres中使用空值时concat()和||之间的区别。为什么如果拼接的两个部分都是null,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
will return:
我知道concat()会忽略null,但如果concat中所有的值都是null,那么预期的结果不应该是null吗?这是postgres中所有函数的典型行为吗?我在文档中没有找到有关此情况的任何信息。编辑:
我想到可能这是任何字符串函数的预期结果,但事实并非如此。如果传递null值,则upper()和left()都返回null:
SELECT concat(NULL), NULL||NULL, UPPER(null), left(NULL,1)
结果:
CONCAT
的想法并不是因为其中一个连接部分为空而使字符串为空。因此,空值不会使结果为空;你仍然得到一个字符串。这就是论点所在 :-) 尽管如此,我同意这有点出乎意料,应该在文档中明确提到。 - Thorsten Kettnerconcat
的行为类似于聚合函数(例如SUM
忽略NULL
)。此外,请注意在文档中,只有concat
和concat_ws
这两个函数声明:“忽略NULL参数”。因此,我认为默认行为是将NULL视为优先级最高(这反映了SQL标准)。 - Zack