这是
Postgresql 9.2.4上的设置:
CREATE TABLE table ( id integer NOT NULL,some_text text );
现在我们输入一个记录,一个null或空字符串为some_text,所以当我们查询:
SELECT * FROM table WHERE some_text IS NULL;
我得到回来到现在为止还挺好.
但是,当我查询:
SELECT * FROM table WHERE some_text NOT ILIKE "%anything%';
我发现没有任何回报.这是为什么?我希望一个空或空字符串是“不像任何东西”.
在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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。