From: | Jeff Janes <jeff(dot)janes(at)gmail(dot)com> |
---|---|
To: | Israel Brewster <israel(at)ravnalaska(dot)net> |
Cc: | "pgsql-general(at)postgresql(dot)org general" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Pattern match against array elements? |
Date: | 2015-10-12 18:18:07 |
Message-ID: | CAMkU=1xfVDgjdsez2ScZRpYuwB0bo4FCDDq7BpDvWv-_zSkOZw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Mon, Oct 12, 2015 at 10:58 AM, Israel Brewster <israel(at)ravnalaska(dot)net>
wrote:
> 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 a grouped query
> that, among other things, returns an array of values, 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 wildcard is on the left of the
> operator, and needs to be on the right.
Right. The LIKE operator does not have a commutator by default. (And if
you created one for it, it could not use an index in this case.)
> 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)?
>
I think you're best bet is to do a subquery against the unaggregated table.
select * from aggregated a where exists
(select 1 from unaggregated ua where a.lognum=ua.lognum and flightnum
like '8%')
This is a common problem. If you find a better solution, I'd love to hear
it!
Cheers,
Jeff
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2015-10-12 18:39:38 | Re: Pattern match against array elements? |
Previous Message | dinesh kumar | 2015-10-12 18:14:57 | Re: Pattern match against array elements? |