在 SQL 中,NULL 不等于任何东西。也不不等于任何东西。
换句话说,如果我不告诉你我的中间名,你也不告诉我你的中间名,我们怎么知道我们的两个中间名是同一个名字还是不同的名字?我们无法知道。
这通常会使人们在 SQL 中犯错,因为它是“三值逻辑”。表达式可以是 TRUE、FALSE 或 UNKNOWN。熟悉布尔代数的人都知道 NOT TRUE 是 FALSE,NOT FALSE 是 TRUE。
但棘手的是,“未知”仍然是“未知”。
因此,您的解决方案要么始终在列中存储非空字符串,要么使用表达式来解释三值逻辑:
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 还支持空安全相等运算符:
SELECT * FROM table WHERE some_text IS DISTINCT FROM 'anything';
但不幸的是,这只适用于相等性,而不适用于带有模式和通配符的 LIKE/ILIKE。