53

Is there any shorter way to look for multiple matches:

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

This questions applies to PostgreSQL 9.1, but if there is a generic solution it would be even better.

a_horse_with_no_name
  • 497,550
  • 91
  • 775
  • 843
sorin
  • 149,293
  • 163
  • 498
  • 754
  • It reads well, works well and is easy to understand. Why swap that for alternatives like the popular answer and get into knots when you need to find pipes (`|`) or brackets in actual data? – RichardTheKiwi Oct 18 '12 at 16:07
  • @RichardTheKiwi Because is it not as easy to dynamically build. See my answer on how to avoid dealing with a regex. – Clodoaldo Neto Oct 19 '12 at 12:25
  • 1
    @Clo It's still code that's not ISO standard and *harder* to understand by comparison. Except possibly `any (values('AAA%'), ('BBB%'), ('CCC%')` That one looks good. – RichardTheKiwi Oct 19 '12 at 12:30

6 Answers6

66

Perhaps using SIMILAR TO would work ?

SELECT * from table WHERE column SIMILAR TO '(AAA|BBB|CCC)%';
tozka
  • 3,001
  • 17
  • 23
30

Use LIKE ANY(ARRAY['AAA%', 'BBB%', 'CCC%']) as per this cool trick @maniek showed earlier today.

Community
  • 1
  • 1
Craig Ringer
  • 283,586
  • 65
  • 635
  • 730
29

Using array or set comparisons:

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

It is also possible to do an AND which would not be easy with a regex if it were to match any order:

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

select str from t
where str like all (values('%999%'), ('DDD%'));
Clodoaldo Neto
  • 108,856
  • 25
  • 211
  • 247
9

You can use regular expression operator (~), separated by (|) as described in Pattern Matching

select column_a from table where column_a ~* 'aaa|bbb|ccc'
Diego
  • 111
  • 1
  • 5
4

Following query helped me. Instead of using LIKE, you can use ~*.

select id, name from hosts where name ~* 'julia|lena|jack';
Anto
  • 2,192
  • 1
  • 14
  • 13
-5

You might be able to use IN, if you don't actually need wildcards.

SELECT * from table WHERE column IN ('AAA', 'BBB', 'CCC')

ACT
  • 1