【问题标题】:How to use SQL LIKE condition with multiple values in PostgreSQL?如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?
【发布时间】:2012-10-09 02:36:12
【问题描述】:

有没有更短的方法来查找多个匹配项:

 SELECT * 
 from table 
 WHERE column LIKE "AAA%" 
    OR column LIKE "BBB%" 
    OR column LIKE "CCC%"

这个问题适用于 PostgreSQL 9.1,但如果有通用的解决方案那就更好了。

【问题讨论】:

  • 它读起来很好,效果很好,而且很容易理解。当您需要在实际数据中查找管道 (|) 或括号时,为什么要将其替换为流行答案等替代方案并陷入困境?
  • @RichardTheKiwi 因为动态构建不是那么容易。请参阅我关于如何避免处理正则表达式的答案。
  • @Clo 它仍然是不是 ISO 标准的代码,相比之下 更难 理解。除了any (values('AAA%'), ('BBB%'), ('CCC%') 那个看起来不错。

标签: sql postgresql postgresql-9.1


【解决方案1】:

以下查询帮助了我。您可以使用~*,而不是使用LIKE

select id, name from hosts where name ~* 'julia|lena|jack';

【讨论】:

    【解决方案2】:

    您可以使用正则表达式运算符 (~),用 (|) 分隔,如 Pattern Matching

    中所述
    select column_a from table where column_a ~* 'aaa|bbb|ccc'
    

    【讨论】:

      【解决方案3】:

      如果您实际上不需要通配符,则可以使用 IN。

      选择 * 从表 WHERE 列 IN ('AAA', 'BBB', 'CCC')

      【讨论】:

        【解决方案4】:

        按照这个很酷的技巧使用LIKE ANY(ARRAY['AAA%', 'BBB%', 'CCC%']) @maniek showed earlier today

        【讨论】:

        • 你只是错过了语法。列表必须是数组或集合。
        • 我相信 ANY 是在 Postgres 7.4 中添加的。
        【解决方案5】:

        使用数组或集合比较:

        create table t (str text);
        insert into t values ('AAA'), ('BBB'), ('DDD999YYY'), ('DDD099YYY');
        
        select str from t
        where str like any ('{"AAA%", "BBB%", "CCC%"}');
        
        select str from t
        where str like any (values('AAA%'), ('BBB%'), ('CCC%'));
        

        也可以做一个AND,如果要匹配任何订单,这对于正则表达式来说并不容易:

        select str from t
        where str like all ('{"%999%", "DDD%"}');
        
        select str from t
        where str like all (values('%999%'), ('DDD%'));
        

        【讨论】:

        • 我相信 ANYALL 是在 Postgres 7.4 中添加的。
        【解决方案6】:

        也许使用SIMILAR TO 会起作用?

        SELECT * from table WHERE column SIMILAR TO '(AAA|BBB|CCC)%';
        

        【讨论】:

        • +1 SIMILAR TO 可以,但对于问题中的示例,它应该是 SIMILAR TO 'AAA%|(BBB|CCC)%'SIMILAR TO '(AA%|BBB%|CCC%'
        • Similar to 已添加到 Postgres 7.3,因此 Netezza 系统等可能不允许使用它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 2011-09-04
        • 2021-11-21
        • 2022-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多