72

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.

sorin
  • 161,544
  • 178
  • 535
  • 806
  • 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

79

Perhaps using SIMILAR TO would work ?

SELECT * from table WHERE column SIMILAR TO '(AAA|BBB|CCC)%';
tozka
  • 3,211
  • 19
  • 23
41

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

Community
  • 1
  • 1
Craig Ringer
  • 307,061
  • 76
  • 688
  • 778
33

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
  • 118,695
  • 26
  • 233
  • 260
13

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
  • 151
  • 1
  • 6
6

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

select id, name from hosts where name ~* 'julia|lena|jack';
Anto
  • 3,128
  • 1
  • 20
  • 20
-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