From: | Steve Midgley <science(at)misuse(dot)org> |
---|---|
To: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
Cc: | Anton Ananich <anton(dot)ananich(at)gmail(dot)com>, "pgsql-sql(at)postgresql(dot)org" <pgsql-sql(at)postgresql(dot)org> |
Subject: | Re: Custom sort order with jsonb key |
Date: | 2016-06-23 19:14:44 |
Message-ID: | CAJexoSKcyiK4rnnXisxUxjO93AB06HJ+7Nys7NnR3kkymDfDbw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
On Thu, Jun 23, 2016 at 12:03 PM, David G. Johnston <
david(dot)g(dot)johnston(at)gmail(dot)com> wrote:
> On Thu, Jun 23, 2016 at 2:38 PM, Anton Ananich <anton(dot)ananich(at)gmail(dot)com>
> wrote:
>
>> Dear colleagues,
>>
>> I have a table in PostgreSQL with some data:
>>
>> create table FOO (
>> key jsonb
>> );
>>
>> insert into FOO(key) values ('[2014]');
>> insert into FOO(key) values ('[2015]');
>> insert into FOO(key) values ('[2016]');
>> insert into FOO(key) values ('[2014, 2]');
>> insert into FOO(key) values ('[2014, 2, 3]');
>> insert into FOO(key) values ('[2014, 3]');
>> insert into FOO(key) values ('[2014,2,4]');
>> insert into FOO(key) values ('[2014, 2,4]');
>> insert into FOO(key) values ('[2014,3,13]');
>> insert into FOO(key) values ('[2014, 2, 15]');
>>
>> And I try to sort these rows like that:
>>
>> SELECT key FROM FOO order by key;
>>
>> The result is:
>>
>> [2014]
>> [2015] <==
>> [2016] <==
>> [2014, 2]
>> [2014, 3] <==
>> [2014, 2, 3]
>> [2014, 2, 4]
>> [2014, 2, 4]
>> [2014, 2, 15]
>> [2014, 3, 13]
>>
>> But what I need is
>>
>> [2014]
>> [2014, 2]
>> [2014, 2, 3]
>> [2014, 2, 4]
>> [2014, 2, 4]
>> [2014, 2, 15]
>> [2014, 3] <==
>> [2014, 3, 13]
>> [2015] <==
>> [2016] <==
>>
>> is there a way to achieve it?
>>
>
> Maybe try:
>
> ORDER BY key->>1::int, key->>2::int, key->>3::int
>
> There is no easy way, presently, to convert from a json array to a
> PostgreSQL array. If you do that I believe that those sort based upon the
> values and not lexically.
>
> SELECT *
> FROM ( VALUES (ARRAY[2014]::int[], ARRAY[2014,2]::int[],
> ARRAY[2015]::int[]) ) vals (v)
> ORDER BY v;
>
> David J.
>
> I spent a couple minutes goofing off on this question - this isn't exactly
right and is UGLY, but maybe helps a bit with some ideas (the virtual table
is needless, but my sql is rusty):
SELECT key, to_number(key#>>'{0}','9999') as order1,
to_number(key#>>'{1}','9') as order2 FROM FOO
order by order1, order2
"[2014, 2, 4]";2014;2
"[2014, 2, 15]";2014;2
"[2014, 2, 4]";2014;2
"[2014, 2]";2014;2
"[2014, 2, 3]";2014;2
"[2014, 3]";2014;3
"[2014, 3, 13]";2014;3
"[2014]";2014;
"[2015]";2015;
"[2016]";2016;
2014 is coming after all the elements that have a value associated with
2014 - probably you could solve this with a coalesce, but I'm out of time
messing with it. I hope it's helpful!
Steve
From | Date | Subject | |
---|---|---|---|
Next Message | Anthony Ananich | 2016-06-23 19:40:55 | Re: Custom sort order with jsonb key |
Previous Message | David G. Johnston | 2016-06-23 19:03:52 | Re: Custom sort order with jsonb key |