From: | hubert depesz lubaczewski <depesz(at)depesz(dot)com> |
---|---|
To: | Ben Chobot <bench(at)silentmedia(dot)com> |
Cc: | pgsql-general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: looping over multirange segments? |
Date: | 2021-07-15 12:15:09 |
Message-ID: | 20210715121508.GA30348@depesz.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Wed, Jul 14, 2021 at 04:19:48PM -0700, Ben Chobot wrote:
> I'm really, really liking the multirange types in PG14. Thank you for making
> them! Unfortunately I am struggling with how to loop over the segments of a
> multirange. There doesn't seem to be a way to convert them to arrays, and I
> can't just use plpgsql's FOREACH on one. Am I missing something obvious? It
> seems like a reasonable thing to want to do.
>
> FWIW, my actual end goal is to take something like this:
>
> select int8range(1,10)::int8multirange - int8range(4,6)::int8multirange;
> ?column?
> ────────────────
> {[1,4),[6,10)}
>
> ...and turn it into this:
>
> select ???;
> int8range │ ?column?
> ───────────┼──────────
> [1,4) │ 0
> [6,10) │ 0
There isn't anything nice now. There was, for a brief moment, unnest()
over multiranges, but it got reverted. While it's not there, you can use
regexps to split it. I know it's ugly, but it should work, for now.
For example you can:
select * from regexp_matches(_YOUR_MULTIRANGE_::text, '[\[(][^\])]+[\])]', 'g');
I wrote more, including explanation, and ready-to-use function, in here:
https://www.depesz.com/2021/07/15/how-to-get-list-of-elements-from-multiranges/
depesz
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2021-07-15 13:36:27 | Re: ERROR: cannot freeze committed xmax |
Previous Message | Willy-Bas Loos | 2021-07-15 10:42:59 | Re: WAL accumulating, Logical Replication pg 13 |