我必须选择表(我们称之为 mytable
)中给定列(我们称之为 mycolumn
)中的值为 不等于“A”且不等于“S”。
所以我尝试了类似的东西
SELECT * FROM mytable WHERE mycolumn NOT ILIKE ANY(ARRAY['A','S'])
我更喜欢使用 ILIKE
而不是使用 =
来测试字符串相等性,因为值 'A' 和 'S' 可能以小写形式出现我的数据,所以我希望也排除值“s”和“a”。
奇怪的是,上面的查询确实返回了一些行,其中 mycolumn
中的值等于“A”。我很惊讶。
因此,为了了解发生了什么,我尝试进行一个非常简单的逻辑测试:
SELECT ('A' ILIKE ANY(ARRAY['A','S'])) as logical_test ;
上面的语句返回 TRUE,这是预期的。
但是下面的语句也返回 TRUE,这就是我迷路的地方:
SELECT ('A' NOT ILIKE ANY(ARRAY['A','S'])) as logical_test ;
有人可以解释为什么 'A' NOT ILIKE ANY(ARRAY['A','S'])
被 PostgreSQL 认为是 TRUE 吗?
最佳答案
如果数组中至少有一个元素符合条件,则 ANY 比较的结果为真。
作为'S'
不同于'A'
ANY
的结果是真的(因为至少 一个 元素是不同的)。
您正在寻找 ALL
运算符(operator):
SELECT *
FROM mytable
WHERE mycolumn NOT ILIKE ALL(ARRAY['A','S'])
关于sql - 了解 ILIKE 数组的任何元素 - postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49557830/