Eu tenho uma tabela no PostgreSQL com alguns dados:
create table t2 (
key jsonb,
value jsonb
);
INSERT INTO t2(key, value)
VALUES
('1', '"test 1"')
,('2', '"test 2"')
,('3', '"test 3"')
,('[]', '"test 4"')
,('[1]', '"test 5"')
,('[2]', '"test 6"')
,('[3]', '"test 7"')
,('[1, 2]', '"test 8"')
,('[1, 2, 3]', '"test 9"')
,('[1, 3]', '"test 10"')
,('[1,2,4]', '"test 11"')
,('[1, 2,4]', '"test 12"')
,('[1,3,13]', '"test 13"')
,('[1, 2, 15]', '"test 15"');
E eu tento classificar essas linhas assim:
SELECT key FROM t2 order by key;
O resultado é:
[]
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]
Mas o que eu preciso é:
[]
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] <==
Existe uma maneira de conseguir isso?
Respostas:
Primeiro, sua pergunta e o nome da coluna
"key"
são enganosos. A chave da coluna não contém nenhuma chave JSON , apenas valores . Casojsonb_object_keys(jsonb)
contrário, poderíamos usar a função para extrair chaves, mas não é assim.Supondo que todas as suas matrizes JSON estejam vazias ou contenham números inteiros, como demonstrado. E os valores escalares (não matrizes) também são inteiros.
Sua ordem de classificação básica funcionaria com matrizes do Postgres
integer
(ounumeric
). Eu uso essa pequena função auxiliar para converterjsonb
matrizes para o Postgresint[]
:Explicação:
Em seguida, adicione
jsonb_typeof(jsonb)
para chegar a:Produz exatamente o resultado desejado.
Por quê?
O manual para
jsonb
explica:Negrito ênfase minha.
Por isso
jsonb '[2]' < jsonb '[1, 2]'
.Porém, as matrizes do Postgres apenas classificam elemento por elemento:
'{2}'::int[] > '{1, 2}'
- exatamente o que você estava procurando.fonte
Referindo-se ao problema para ordenar seus resultados por valores inteiros json. Tentar:
No seu caso, parece ser uma matriz para a chave de pedidos. Então, primeiro tente concatinar os valores no seu campo "chave".
fonte