以下是Postgresql 9.2.4上的设置:

CREATE TABLE table (
    id integer NOT NULL,
    some_text text
);

现在我们输入一条记录,空字符串为some_text,这样当我们查询时:

SELECT * FROM table WHERE some_text IS NULL;

我把条目拿回来了.到现在为止,一直都还不错.

然而,当我问:

SELECT * FROM table WHERE some_text NOT ILIKE "%anything%';

我发现什么也没归还.为什么?我希望null或空字符串是"不像anything".

推荐答案

在SQL中,NULL不等于任何值.它也不是不平等的.

换句话说,如果我不告诉你我的中间名,你也不告诉我你的中间名,我们怎么知道我们两个中间名是同一个名字还是不同的名字?我们不知道.

在SQL中,这常常会让人不知所措,因为它是"三值逻辑"表达式可以是真的、假的或未知的.我们这些熟悉布尔代数的人都知道,非真即假,非假即真.

但棘手的是,不是未知就是未知.

因此,您的解决方案是在列中始终存储非空字符串,或者使用表达式来解释三值逻辑:

SELECT * FROM table WHERE some_text NOT ILIKE "%anything%' OR some_text IS NULL;

或者:

SELECT * FROM table WHERE COALESCE(some_text, '') NOT ILIKE '%anything%';

PostgreSQL还支持null-safe equality operator:

SELECT * FROM table WHERE some_text IS DISTINCT FROM 'anything';

但不幸的是,这只适用于相等,而不适用于带有模式和通配符的LIKE/ILIKE.

Postgresql相关问答推荐

PostgreSQL按描述请求

带有regex表达式的Postgres SQL

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

当参数大小超过 393166 个字符时,PSQL 准备语句查询挂起

是否可以调整 PostgreSQL 中的数组以适应 IN 运算符?

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

gorm 创建并返回值 many2many

Docker compose read connection reset by peer error on pipeline

PL/pgSQL 中 PL/SQL %ISOPEN 的类似功能是什么?

在 SQL 上返回负值

将一列与另一列的每个元素进行比较,该列是一个数组

为什么这里的默认格式不同? (ISO 8601 的两种不同实现)

Postgres - 如何加入两列?

PostgreSQL:如何避免被零除?

Rails:创建删除表级联迁移

如何在 Postgresql 中正确使用 FETCH FIRST?

Postgres 外键on update和on delete选项如何工作?

Rails PG::UndefinedTable:错误:missing FROM-clause entry for table

升级到 Yosemite 10.10 后无法连接到 postgresql 数据库

提高查询速度:simple SELECT in big postgres table