Is there any way to do a pattern match against the elements of an array in postgresql (9.4 if the version makes a difference)? I have an aggregate function that, among other things, returns an array of elements, like:
SELECT
lognum
,array_agg(flightnum) as flightnums
FROM logs
GROUP BY lognum;
Where the flightnum
field is a varchar containing either a text string or a three-or-four digit number. Now say I want to select all logs that have a flight number starting with an '8' (so '800' or '8000' series flights). My first thought was to do something like this:
SELECT
*
FROM (
SELECT
lognum
,array_agg(flightnum) as flightnums
FROM logs
GROUP BY
lognum
) s1
WHERE
'8%' like ANY(flightnums);
But while this doesn't give an error, it also doesn't return any results. I'm guessing that this is because the wild card is on the left of the operator. Of course, turning it around to be:
WHERE ANY(flightnum) like '8%'
gives me a syntax error. So is there any way I can run this query such that I get any rows containing a flight number that starts with an 8 (or whatever)?
Please note that this is a simplified example demonstrating just the section I am having difficulty with.
Best Answer
You can accomplish what you're asking for by doing something like this.
I created a table and data to help better illustrate what I'm doing.
Note that 1, 2, and 4 have flights with 8, 80, and 8008.
Now, using this query, find the
lognums
with 8 as aflightnum
. This takes your original query with anarray_agg
, wraps another query around it to generates subscripts for each member in the array, which can be arbitrarily large. Finally, an outer query wraps that, which uses the generated subscript to allow you to do a comparison against each of the members of theflightnums
array to see if they areLIKE '8%'
.Which gives you the following output
As would be expected from the data above.
For further array manipulation needs, I would recommend reading up on their chapter in the PostgreSQL documentation arrays