在Postgres:
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
我是应该习惯这种行为,用“连”来连接,还是说这是应该解决的问题?
发布于 2017-11-30 00:56:03
发布于 2016-01-22 06:50:02
这不是虫子,也不是“怪人”。
null
标准需要任何涉及null
的表达式。这不仅限于字符串连接,还适用于计算,例如:42 * null
返回null
。
这也适用于比较:42 > null
产生null
。所以比较它既不对也不假。虽然在现实中这有“假”的效果,但更多的是因为它“不对”,而不是“假”。但是否定这样的表达式会再次产生null
,而不是"true“。
由于null
非常特殊,检查某物是否为null的唯一方法是使用运算符IS NULL
或IS NOT NULL
。x is null
产生真或假,它永远不会产生null
,所以使用is null
或is not null
运算符的表达式永远不会返回null --所以这是我上面语句的一个例外(感谢乔纳森指出这一点)。
关于null
值的另一个可能令人惊讶的事实是它们是如何被聚合函数处理的。虽然表达式4 + 5 + null
会产生null,但那些(列)值上的sum()
将产生9,因为聚合忽略null
值。
下表如下:
col1
--------
1
2
3
null
sum(col1)
将返回6,avg(col1)
将返回2
(sum = 6,添加的元素数: 3)
发布于 2016-01-21 22:18:28
是的,这是我们想要的行为。
下面是一个非常有用的例子。假设您有一个persons表,其中有title
、firstname
、nameaffix
和lastname
字段。要构建一个全名,您可以简单地这样做。
COALESCE(title || ' ', '') || firstname || COALESCE(' ' || nameaffix, '') || ' ' || lastname
如果没有这种奇怪的行为,就可以根据字段是否为空,将空格放置在正确的位置。假设具有强制性的名称和姓氏,则涵盖任何标题和名称词缀的组合。
https://stackoverflow.com/questions/34934762
复制相似问题