Ich habe eine Tabelle in PostgreSQL mit einigen Daten:
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"');
Und ich versuche diese Zeilen so zu sortieren:
SELECT key FROM t2 order by key;
Das Ergebnis ist:
[]
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]
Aber was ich brauche ist:
[]
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] <==
Gibt es einen Weg, dies zu erreichen?
Antworten:
Zunächst einmal sind Ihre Frage sowie Ihr Spaltenname
"key"
irreführend. Der Spaltenschlüssel enthält keine JSON- Schlüssel , nur Werte . Sonst könnten wir die Funktion verwendenjsonb_object_keys(jsonb)
, um Schlüssel zu extrahieren, aber das ist nicht so.Angenommen, alle Ihre JSON-Arrays sind entweder leer oder enthalten ganzzahlige Zahlen, wie gezeigt. Und die Skalarwerte (Nicht-Arrays) sind ebenfalls ganzzahlig.
Ihre grundlegende Sortierreihenfolge würde mit Postgres
integer
(odernumeric
) Arrays funktionieren . Ich benutze diese kleine Hilfsfunktion , umjsonb
Arrays in Postgres zu konvertierenint[]
:Erläuterung:
Fügen Sie dann hinzu
jsonb_typeof(jsonb)
, um zu folgendem Ergebnis zu gelangen:Erzeugt genau das gewünschte Ergebnis.
Warum?
Das Handbuch für
jsonb
erklärt:Meine kühne Betonung.
Deshalb
jsonb '[2]' < jsonb '[1, 2]'
.Aber Postgres-Arrays sortieren nur Element für Element:
'{2}'::int[] > '{1, 2}'
- genau das, wonach Sie gesucht haben.quelle
Beziehen Sie sich auf das Problem, um Ihre Ergebnisse nach json-Ganzzahlwerten zu ordnen. Versuchen:
In Ihrem Fall scheint es sich um ein Array für den Bestellschlüssel zu handeln. Versuchen Sie also zuerst, die Werte in Ihrem "Schlüsselfeld" zu verknüpfen.
quelle