PostgreSQL不在多个通配符中

PostgreSQL不在多个通配符中,sql,postgresql,select,postgresql-9.6,Sql,Postgresql,Select,Postgresql 9.6,你知道为什么以下方法有效吗 SELECT ID, Name FROM dbo.Survey SURV WHERE (SURV.Title ILIKE ANY (ARRAY['%Empl%', '%Cont%', '%Staff%'])) 但这并不是: SELECT ID, Name FROM dbo.Survey SURV WHERE (SURV.Title NOT ILIKE ANY (ARRAY['%Empl%', '%Cont%', '%Staff%'])) 我没有收到错误,但是,第一

你知道为什么以下方法有效吗

SELECT ID, Name FROM dbo.Survey SURV
WHERE (SURV.Title ILIKE ANY (ARRAY['%Empl%', '%Cont%', '%Staff%']))
但这并不是:

SELECT ID, Name FROM dbo.Survey SURV
WHERE (SURV.Title NOT ILIKE ANY (ARRAY['%Empl%', '%Cont%', '%Staff%']))
我没有收到错误,但是,第一个查询似乎返回所有正确的结果,而第二个查询似乎没有从我的结果集中删除任何记录


请注意:SURV.Title列中没有任何
NULL
值。

您的布尔逻辑有错误。考虑,例如,字符串<代码> abcRePyxz 。它
我喜欢“%emp%”
,但不是
我喜欢“%Cont%”
,因此它将被返回。当您对这样的布尔条件求反时,需要将
any
替换为
all

SELECT ID, Name FROM dbo.Survey SURV
WHERE (SURV.Title NOT ILIKE ALL (ARRAY['%Empl%', '%Cont%', '%Staff%']))
-- Here --------------------^

为什么不直接使用正则表达式呢

WHERE NOT LOWER(SURV.Title) ~ 'empl|cont|staff'

或者
WHERE NOT(SURV.Title我喜欢任何(数组['%emp%','%Cont%','%Staff%])
谢谢-这就是我需要它做的。