Saya punya tabel di PostgreSQL dengan beberapa data:
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"');
Dan saya mencoba mengurutkan baris-baris ini seperti itu:
SELECT key FROM t2 order by key;
Hasilnya adalah:
[]
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]
Tapi yang saya butuhkan adalah:
[]
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] <==
Apakah ada cara untuk mencapainya?
Jawaban:
Pertama, pertanyaan Anda serta nama kolom Anda
"key"
menyesatkan. Kunci kolom tidak mengandung kunci JSON , hanya nilai . Lain kita bisa menggunakan fungsijsonb_object_keys(jsonb)
untuk mengekstrak kunci, tetapi tidak begitu.Dengan asumsi semua array JSON Anda kosong atau tahan angka integer seperti yang ditunjukkan. Dan nilai skalar (non-array) juga bilangan bulat.
Urutan sortir dasar Anda akan berfungsi dengan array Postgres
integer
(ataunumeric
). Saya menggunakan fungsi pembantu kecil ini untuk mengonversijsonb
array ke Postgresint[]
:Penjelasan:
Kemudian tambahkan
jsonb_typeof(jsonb)
untuk sampai di:Menghasilkan hasil yang diinginkan dengan tepat.
Mengapa?
Manual untuk
jsonb
menjelaskan:Penekanan berani saya.
Itu sebabnya
jsonb '[2]' < jsonb '[1, 2]'
.Tapi array Postgres hanya mengurutkan elemen demi elemen:
'{2}'::int[] > '{1, 2}'
- persis apa yang Anda cari.sumber
Mengacu pada masalah untuk memesan hasil Anda dengan nilai integer json. Mencoba:
Dalam kasus Anda, sepertinya itu adalah array untuk kunci pemesanan. Jadi pertama-tama cobalah untuk menggabungkan nilai dalam bidang "kunci" Anda.
sumber