在博士后:

select 'test' || null  returns null

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

这是你想要的行为吗?看起来很奇怪,字符串与空值的连接会使整个字符串无效...

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

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

鉴于此,使用concat字符串函数示例:

concat(str "any" [, str "any" [, ...] ]) text Concatenate all arguments. NULL arguments are ignored. concat('abcde', 2, NULL, 22) >> abcde222

我是应该习惯这种行为,还是应该修正这种行为?

推荐答案

这不是虫子,也不是"奇怪".

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

这也适用于比较:42 > null产生null.所以这个比较既不正确也不错误.虽然在现实中这有"假"的效果,但更多的是因为它是"假",而不是假.但否定这样一个表达会再次产生null,而不是"真的".

因为null非常特殊,所以判断某个值是否为null的唯一方法是使用运算符IS NULLIS NOT NULL.x is null会产生true或false,它永远不会产生null,所以使用is nullis not null运算符never的表达式返回null——所以这是我上面陈述的一个例外(感谢Jonathan指出这一点).


另一个可能令人惊讶的事实是,关于null个值,聚合函数是如何处理它们的.虽然expression 4 + 5 + null产生空值,但这些(列)值上的sum()将产生9,因为总计ignore null个值.

鉴于下表:

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

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

Postgresql相关问答推荐

在输入稍有错误的PostgreSQL表中进行快速字符串搜索

如何计算每月的出版物数量?

如何计算过滤器中的百分比

Windows上的psql:错误:编码UTF8的字节序列无效:0xc8 0x20

JPA findBy 字段忽略大小写

postgresql查询中的正则表达式不区分大小写

在 Ubuntu 11.04 服务器中启用对 postgresql 的 PHP 支持

PostgreSQL 返回准确或最接近查询日期的日期

在 postgres 中Decode解码相似的函数

如何在可选参数上查询 postgres?

从 PostgreSQL 中的字段中提取数字

Postgresql 中的 NOT EXISTS 子句

如何从 CSV 为 PostgreSQL 副本生成模式

PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ

安装了 Postgres.app 但它不起作用

PostgreSQL 中跨多个表的索引

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

删除空行

Postgres DB 上的整数超出范围

postgresql DB中唯一键的正确数据类型是什么?