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

时间:2018-10-15 16:17:52

标签: sql postgresql

我试图理解concat()和||之间的区别。在使用null时在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

将返回:

enter image description here

我知道concat()会忽略null,但是如果concat中的所有值都为null,预期结果是否为null?这是Postgres中所有功能的典型行为吗?在这种情况下,我在文档中找不到任何内容。

编辑:

我认为这可能是任何字符串函数的预期结果,但事实并非如此。如果传递了null值,则upper()和left()均返回null:

SELECT concat(NULL), NULL||NULL, UPPER(null), left(NULL,1)

结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

在concat()函数中:

text concat(str "any",...)  Concatenate all arguments. NULL arguments are ignored.

注意:NULL参数将被忽略。

想象一下:

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

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

(与||破坏了一切的NULL运算符相反)


||中的

运算符:

  

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

所以NULL||NULL的语法错误

但是为什么不给出错误? 因为在concat操作中,如果我们不拒绝NULL(像concat函数一样),它们将淹没一切

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

输出:

NULL

more info

  

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