【问题标题】:Why does null||null return a null value but concat(null,null) returns an empty string in postgres? [duplicate]为什么 null||null 在 postgres 中返回一个空值而 concat(null,null) 返回一个空字符串? [复制]
【发布时间】: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)。另外,请注意,在文档中,concatconcat_ws 是唯一声明:“NULL arguments are ignored”的函数。所以我认为默认行为是 NULL 胜过(这反映了 SQL 标准)。

标签: sql postgresql


【解决方案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 所示。对于其他情况,插入显式强制 如果您需要复制以前的行为,请输入文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多