J'ai une table dans PostgreSQL avec quelques données:
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"');
Et j'essaie de trier ces lignes comme ça:
SELECT key FROM t2 order by key;
Le résultat est:
[]
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]
Mais ce dont j'ai besoin c'est:
[]
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-t-il un moyen d'y parvenir?
Réponses:
Tout d'abord, votre question ainsi que le nom de votre colonne
"key"
sont trompeurs. La clé de colonne ne contient aucune clé JSON , uniquement des valeurs . Sinon, nous pourrions utiliser la fonctionjsonb_object_keys(jsonb)
pour extraire des clés, mais ce n'est pas le cas.En supposant que tous vos tableaux JSON sont vides ou contiennent des nombres entiers comme illustré. Et les valeurs scalaires (non-tableaux) sont également entières.
Votre ordre de tri de base fonctionnerait avec les tableaux Postgres
integer
(ounumeric
). J'utilise cette petite fonction d'aide pour convertir desjsonb
tableaux en Postgresint[]
:Explication:
Ajoutez ensuite
jsonb_typeof(jsonb)
pour arriver à:Produit exactement le résultat souhaité.
Pourquoi?
Le manuel de
jsonb
explique:Accentuation sur moi.
Voilà pourquoi
jsonb '[2]' < jsonb '[1, 2]'
.Mais les tableaux Postgres trient simplement élément par élément:
'{2}'::int[] > '{1, 2}'
- exactement ce que vous cherchiez.la source
Se référant au problème pour classer vos résultats par valeurs entières json. Essayer:
Dans votre cas, il semble s'agir d'un tableau pour la clé de commande. Essayez donc d'abord de concaténer les valeurs dans votre champ "clé".
la source