使用NULL连接字符串似乎会使整个字符串无效-Postgres中是否需要这样的行为? [英] String concatenation with a null seems to nullify the entire string - is that desired behavior in Postgres?

查看:13
本文介绍了使用NULL连接字符串似乎会使整个字符串无效-Postgres中是否需要这样的行为?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Postgres中:

select 'test' || null  returns null

我原以为它会返回"test"。

这是所需的行为吗?使用空值连接字符串会使整个字符串无效,这似乎很奇怪.

引用PG文档:http://www.postgresql.org/docs/9.1/static/functions-string.html

"注意:在PostgreSQL8.3之前,这些函数也会静默接受几个非字符串数据类型的值,因为这些数据类型存在对文本的隐式强制。这些强制已被删除,因为它们经常导致令人惊讶的行为。但是,字符串连接运算符(||)仍然接受非字符串输入,只要至少有一个输入是字符串类型,如表9-6所示。对于其他情况,如果需要复制前面的行为,请向文本插入显式强制。"<

鉴于此,使用它们的Concat字符串函数示例:

Concat(str"any"[,str"any"[,.]]) 文本连接所有参数。忽略空参数。Concat(‘abcde’,2,null,22)>abcde222

我应该使用‘||’连接来习惯此行为,还是应该修复此问题?

推荐答案

它不是bug,也不"奇怪"。

SQL标准要求任何涉及null收益率null的表达式。这不仅限于字符串连接,还适用于计算,例如:42 * null返回null

这也适用于比较:42 > null收益率null。所以比较一下,它既不是真的,也不是假的。虽然这在现实中有"假"的效果,但更多的是因为它"不是真的",而不是假的。但是否定这样的表达式将再次产生null,而不是"true"。

因为null非常特殊,所以检查某个内容是否为空的唯一方法是使用运算符IS NULLIS NOT NULLx is null生成TRUE或FALSE,它从不生成null,因此使用is nullis not null运算符的表达式从不返回NULL-因此这是我上面语句的一个例外(感谢Jonathan指出这一点)。


关于null值的另一个可能令人惊讶的事实是聚合函数如何处理它们。当表达式4 + 5 + null生成NULL时,对这些(列)值的sum()将生成9,因为聚合忽略null值。

给定下表:

    col1
--------
       1
       2
       3 
     null

sum(col1)返回6,avg(col1)返回2(sum=6,添加元素数:3)

这篇关于使用NULL连接字符串似乎会使整个字符串无效-Postgres中是否需要这样的行为?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆