Re: Custom sort order with jsonb key
От | Anthony Ananich |
---|---|
Тема | Re: Custom sort order with jsonb key |
Дата | |
Msg-id | DA35C915-50AB-4611-87D1-438BA68EF117@gmail.com обсуждение исходный текст |
Ответ на | Re: Custom sort order with jsonb key (Steve Midgley <science@misuse.org>) |
Список | pgsql-sql |
On Jun 23, 2016, at 22:14, Steve Midgley <science@misuse.org> wrote:On Thu, Jun 23, 2016 at 12:03 PM, David G. Johnston <david.g.johnston@gmail.com> wrote: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):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::intThere 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.SELECT key, to_number(key#>>'{0}','9999') as order1, to_number(key#>>'{1}','9') as order2 FROM FOOorder 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
In my case the array may be much longer and contain not just numbers, but also strings.
It may be easier to patch RDBMS sources. Where is this sort performed?
Regards,
Anthony Ananich
В списке pgsql-sql по дате отправления: