Re: Custom sort order with jsonb key

Поиск
Список
Период
Сортировка
От Steve Midgley
Тема Re: Custom sort order with jsonb key
Дата
Msg-id CAJexoSKcyiK4rnnXisxUxjO93AB06HJ+7Nys7NnR3kkymDfDbw@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Custom sort order with jsonb key  ("David G. Johnston" <david.g.johnston@gmail.com>)
Ответы Re: Custom sort order with jsonb key  (Anthony Ananich <anton.ananich@gmail.com>)
Список pgsql-sql


On Thu, Jun 23, 2016 at 12:03 PM, David G. Johnston <david.g.johnston@gmail.com> wrote:
On Thu, Jun 23, 2016 at 2:38 PM, Anton Ananich <anton.ananich@gmail.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


В списке pgsql-sql по дате отправления:

Предыдущее
От: "David G. Johnston"
Дата:
Сообщение: Re: Custom sort order with jsonb key
Следующее
От: Anthony Ananich
Дата:
Сообщение: Re: Custom sort order with jsonb key