Mam tabelę w PostgreSQL z pewnymi danymi:
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"');
Próbuję posortować te wiersze w ten sposób:
SELECT key FROM t2 order by key;
Wynik to:
[]
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]
Ale potrzebuję:
[]
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] <==
Czy istnieje sposób na osiągnięcie tego?
Odpowiedzi:
Po pierwsze, twoje pytanie oraz nazwa kolumny
"key"
wprowadzają w błąd. Klucz kolumny nie zawiera żadnych kluczy JSON , tylko wartości . W przeciwnym razie moglibyśmy użyć funkcjijsonb_object_keys(jsonb)
do wyodrębnienia kluczy, ale tak nie jest.Zakładając, że wszystkie tablice JSON są puste lub zawierają liczby całkowite, jak pokazano. A wartości skalarne (nie-tablice) są również liczbami całkowitymi.
Podstawowa kolejność sortowania będzie działać z tablicami Postgres
integer
(lubnumeric
). Używam tej małej funkcji pomocniczej do konwersjijsonb
tablic na Postgresint[]
:Wyjaśnienie:
Następnie dodaj,
jsonb_typeof(jsonb)
aby dotrzeć do:Daje dokładnie pożądany rezultat.
Dlaczego?
Instrukcja
jsonb
wyjaśnia:Odważny nacisk moje.
Dlatego
jsonb '[2]' < jsonb '[1, 2]'
.Ale tablice Postgres sortują element po elemencie:
'{2}'::int[] > '{1, 2}'
- dokładnie to, czego szukałeś.źródło
Odnosząc się do problemu, aby uporządkować wyniki według liczb całkowitych json. Próbować:
W twoim przypadku wydaje się, że jest to tablica dla klucza zamówienia. Najpierw spróbuj skonkatować wartości w polu „klucz”.
źródło