自定义jsonb键排序顺序

时间:2016-06-23 18:02:53

标签: sql postgresql jsonb

我在PostgreSQL中有一个包含一些数据的表:

create table t2 (
    key jsonb,
    value jsonb
);

insert into t2(key, value) values ('1', '"test 1"');
insert into t2(key, value) values ('2', '"test 2"');
insert into t2(key, value) values ('3', '"test 3"');
insert into t2(key, value) values ('[]', '"test 4"');
insert into t2(key, value) values ('[1]', '"test 5"');
insert into t2(key, value) values ('[2]', '"test 6"');
insert into t2(key, value) values ('[3]', '"test 7"');
insert into t2(key, value) values ('[1, 2]', '"test 8"');
insert into t2(key, value) values ('[1, 2, 3]', '"test 9"');
insert into t2(key, value) values ('[1, 3]', '"test 10"');
insert into t2(key, value) values ('[1,2,4]', '"test 11"');
insert into t2(key, value) values ('[1, 2,4]', '"test 12"');
insert into t2(key, value) values ('[1,3,13]', '"test 13"');
insert into t2(key, value) values ('[1, 2, 15]', '"test 15"');

我尝试对这些行进行排序:

SELECT key FROM t2 order by key;

结果是:

[]
1
2
3
[1]
[2] <==
[3] <==
[1, 2]
[1, 3] <==
[1, 2, 3]
[1, 2, 4]
[1, 2, 4]
[1, 2, 15]
[1, 3, 13]

但我需要的是

[]
1
2
3
[1]
[1, 2]
[1, 2, 3]
[1, 2, 4]
[1, 2, 4]
[1, 2, 15]
[1, 3] <==
[1, 3, 13]
[2] <==
[3] <==

有没有办法实现它?

2 个答案:

答案 0 :(得分:0)

这样做的一种方法就像

SELECT * FROM t2
ORDER BY case when key= '[]'  then 1
when key= '1'  then 2
when key= '2'  then 3
when key= '3'  then 4
when key= '[1]'  then 5
when key= '[1, 2]'  then 6
when key= '[1, 2, 3]'  then 7
when key='[1, 2, 15]' then 8
when key='[1, 3]' then 9
when key='[1, 3, 13]' then 10
when key='[2]' then 11
when key= '[3]'  then 12    
end asc

您可以在查询中定义自己的自定义排序逻辑。

答案 1 :(得分:0)

混合类型会有些痛苦,你可能并不意味着goint只有三个值:)但仍然是一个想法:

SELECT key FROM t2 order by (key->>0)::text::int,(key->>1)::int ,(key->>2)::int;

会给: "[1, 2, 3]" "[1, 2, 4]" "[1, 2, 4]" "[1, 2, 15]" "[1, 2]" "[1, 3, 13]" "[1, 3]" "1" "[1]" "2" "[2]" "3" "[3]" "[]"

相关问题