【问题标题】:postgresql NOT ILIKE clause does not include null string valuespostgresql NOT ILIKE 子句不包含空字符串值
【发布时间】:2016-06-08 23:10:33
【问题描述】:

这是 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 postgresql


    【解决方案1】:

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

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

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

    但棘手的部分是 NOT UNKNOWN 仍然是 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。

    【讨论】:

    • 我喜欢你对 unknowns 的解释,但我不确定它是如何连接 SQL 的。为什么WHERE null ILIKE '%anything%' 未知?
    • “年轻人,你对数学一无所知。你只是习惯了。” ——约翰·冯·诺依曼
    • 哦,太粗鲁了。这是一个很难回答的问题吗?
    • @applepie:不同意冯诺依曼的观点可能看起来很自大,但这实际上很容易理解 IMO。想象一个黑盒子。你不知道里面有什么。内容未知。如果你问内容是否像%anything%,你无法确定。答案也是未知 ...
    • 啊谢谢欧文。我已经知道你说了什么,但我对为什么null == unknown 感到困惑。如果null 不等于或不等于任何东西,那么它是unknown 是有道理的。
    【解决方案2】:

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

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

    【讨论】:

    • 您假设 anything 不是空字符串。如果是,则此查询将不返回任何行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多