使用NULL连接字符串似乎会使整个字符串无效-Postgres中是否需要这样的行为? [英] String concatenation with a null seems to nullify the entire string - is that desired behavior in Postgres?
本文介绍了使用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 NULL
或IS NOT NULL
。x is null
生成TRUE或FALSE,它从不生成null
,因此使用is null
或is 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屋!
查看全文