这是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
”。
答案 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%';