PostgreSQL 不在多个通配符中

PostgreSQL NOT IN Multiple Wildcards

知道以下为什么有效:

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%']))

我没有收到错误,但是,第一个查询似乎 return 所有正确的结果,而第二个查询似乎没有从我的结果集中删除任何记录。

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

您的布尔逻辑有误。例如,考虑字符串 abcEmplxyz。它ILIKE '%Empl%',但不是ILIKE '%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'