为什么 postgres 中 null||null 返回 null 值,而 concat(null,null) 返回空字符串?

Ane*_*try 5 sql postgresql

我试图理解 concat() 和 || 之间的区别 在 postgres 中使用 null 时。如果 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
Run Code Online (Sandbox Code Playgroud)

将返回:

在此输入图像描述

我知道 concat() 会忽略空值,但是如果 concat 中的所有值都为空,那么预期结果不是空值吗?这是 postgres 中所有函数的典型行为吗?我在文档中找不到有关此场景的任何内容。

编辑:

我有一个想法,也许这是任何字符串函数的预期结果,但事实似乎并非如此。如果传递 null 值,upper() 和 left() 都会返回 null:

SELECT concat(NULL), NULL||NULL, UPPER(null), left(NULL,1)
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

Per*_*Man 1

在 concat() 函数中:

text concat(str "any",...)  Concatenate all arguments. NULL arguments are ignored.
Run Code Online (Sandbox Code Playgroud)

注意:NULL 参数将被忽略。

想象一下:

输入参数concat()是动态的。

所以当我们写:concat('a',null,null,null,null)=> 我们已经写了:concat('a')

(与摧毁一切的||操作员相反)NULL


在 || 操作员:

字符串连接运算符 (||) 仍然接受非字符串输入,只要至少一个输入是字符串类型

所以NULL||NULL有一个错误的语法

但为什么不给出Error呢?因为在 concat 操作中,如果我们不拒绝 NULL(如 concat 函数),它们将压倒一切

SELECT NULL ||'aaa'||'bbb'||'ccc'||'ddd'

输出:

NULL

更多信息

注意:在 PostgreSQL 8.3 之前,这些函数也会默默地接受几种非字符串数据类型的值,因为存在从这些数据类型到文本的隐式强制转换。这些强制措施已被删除,因为它们经常引起令人惊讶的行为。然而,字符串连接运算符(||)仍然接受非字符串输入,只要至少一个输入是字符串类型,如表 9-6 所示。对于其他情况,如果需要重复以前的行为,请插入对文本的显式强制。