【问题标题】:PostgreSQL NOT IN Multiple WildcardsPostgreSQL 不在多个通配符中
【发布时间】:2018-10-16 16:35:59
【问题描述】:

知道为什么以下工作:

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 值。

【问题讨论】:

    标签: sql postgresql select postgresql-9.6


    【解决方案1】:

    您的布尔逻辑有误。例如,考虑字符串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 (SURV.Title ILIKE ANY (ARRAY['%Empl%', '%Cont%', '%Staff%']))
    • 谢谢 - 这正是我需要的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多