postgresql NOT ILIKE子句不包含空字符串值

时间:2013-08-14 23:01:13

标签: sql postgresql

这是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”。

2 个答案:

答案 0 :(得分:40)

在SQL中,NULL不等于任何东西。它也不等于任何东西。

换句话说,如果我不告诉你我的中间名,而你没有告诉我你的中间名,我们怎么知道我们的两个中间名是相同的名字还是不同的名字?我们无法知道。

这通常会让人们在SQL中绊倒,因为它是“三值逻辑”。表达式可以是TRUE,FALSE或UNKNOWN。我们这些熟悉布尔代数的人知道NOT TRUE是FALSE,而NOT FALSE是TRUE。

但棘手的部分是NOT UNKNOWN仍然未知。

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

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。

答案 1 :(得分:6)

您可以使用COALESCE来实现目标,例如

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