首页 > 解决方案 > Postgres查询正则表达式否定不返回预期结果

问题描述

我使用 pgAdmin 4 中的查询工具连接了一个数据库。在其中一张表中,其中一列应包含正好为 8 位的值(例如 12345678)。

有 99 个正好是 8 个数字,还有 1 个是空的(null)。

我想创建一个查找空的查询。以下查询返回匹配的 99 条记录:

SELECT COUNT (*) FROM my_table WHERE my_column ~ '^[0-9]{8}$';

问题是当我添加 ! (负数,就在波浪号之前),我得到 0 个匹配项,而不是预期的 1 个:

SELECT COUNT (*) FROM my_table WHERE my_column !~ '^[0-9]{8}$';

知道会出什么问题吗?

标签: sqlregexpostgresqlpgadmin

解决方案


几乎所有比较操作都会NULL在值为 - 时返回NULL- 并WHERE过滤掉NULL。所以,要么添加一个明确的比较:

WHERE my_column !~ '^[0-9]{8}$' OR my_column IS NULL

或使用COALESCE()

WHERE COALESCE(my_column, '') !~ '^[0-9]{8}$' 

推荐阅读