首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串连接和null似乎使整个字符串无效--这是Postgres中需要的行为吗?

字符串连接和null似乎使整个字符串无效--这是Postgres中需要的行为吗?
EN

Stack Overflow用户
提问于 2016-01-21 21:34:08
回答 4查看 32.9K关注 0票数 54

在Postgres:

代码语言:javascript
运行
复制
select 'test' || null  returns null

我还以为它会回来“测试”。

这是你想要的行为吗?奇怪的是,带有空值的字符串连接会使整个字符串无效.

参考pg文档:http://www.postgresql.org/docs/9.1/static/functions-string.html

“注意:在PostgreSQL 8.3之前,由于从这些数据类型到文本的隐式矫顽力的存在,这些函数也会默默地接受几个非字符串数据类型的值。这些矫顽器已经被移除,因为它们经常导致令人惊讶的行为。然而,字符串级联操作符( insert操作符)仍然接受非字符串输入,只要至少有一个输入是字符串类型的,如表9-6所示。在其他情况下,如果需要复制以前的行为,则向文本插入显式强制。”

在此基础上,使用它们的concat字符串函数示例:

( str "any“[,str "any”,.)文本连接所有参数。空参数被忽略。(“abcde”,2,NULL,22) >> abcde222

我是应该习惯这种行为,用“连”来连接,还是说这是应该解决的问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-30 00:56:03

引用文件

将所有参数连在一起。空参数被忽略。

示例

代码语言:javascript
运行
复制
concat('abcde', 2, NULL, 22) 

返回

代码语言:javascript
运行
复制
abcde222

请参阅文档中的更多内容

票数 51
EN

Stack Overflow用户

发布于 2016-01-22 06:50:02

这不是虫子,也不是“怪人”。

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

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

由于null非常特殊,检查某物是否为null的唯一方法是使用运算符IS NULLIS NOT NULLx is null产生真或假,它永远不会产生null,所以使用is nullis not null运算符的表达式永远不会返回null --所以这是我上面语句的一个例外(感谢乔纳森指出这一点)。

关于null值的另一个可能令人惊讶的事实是它们是如何被聚合函数处理的。虽然表达式4 + 5 + null会产生null,但那些(列)值上的sum()将产生9,因为聚合忽略null值。

下表如下:

代码语言:javascript
运行
复制
    col1
--------
       1
       2
       3 
     null

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

票数 31
EN

Stack Overflow用户

发布于 2016-01-21 22:18:28

是的,这是我们想要的行为。

下面是一个非常有用的例子。假设您有一个persons表,其中有titlefirstnamenameaffixlastname字段。要构建一个全名,您可以简单地这样做。

代码语言:javascript
运行
复制
COALESCE(title || ' ', '') || firstname || COALESCE(' ' || nameaffix, '') || ' ' || lastname

如果没有这种奇怪的行为,就可以根据字段是否为空,将空格放置在正确的位置。假设具有强制性的名称和姓氏,则涵盖任何标题和名称词缀的组合。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34934762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档