Tidak ada jsonb
bawaan operator maupun indeks apa pun yang mendukung filter semacam ini secara langsung (belum).
Saya menyarankan EXISTS
semi-gabung:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Ini menghindari evaluasi yang berlebihan dan DISTINCT
final akhir langkah Anda perlu mendapatkan baris yang berbeda dengan CROSS JOIN
plain .
Jika ini masih belum cukup cepat, solusi khusus yang lebih canggih untuk jenis kueri tertentu adalah dengan mengekstrak string gabungan dari nilai unik (dengan pembatas yang tidak akan mengganggu pola pencarian Anda) per baris dalam IMMUTABLE
fungsi, buat indeks trigram GIN pada ekspresi fungsional dan gunakan ekspresi yang sama dalam kueri Anda.
Terkait:
- Telusuri nilai bersarang dalam larik jsonb dengan operator yang lebih besar
- Menemukan baris yang berisi kunci dalam larik catatan JSONB
- Buat Indeks JSONB Postgres pada Sub-Objek Array
Selain itu, jika jsonb
. Anda nilai benar-benar terlihat seperti contoh, Anda dapat memangkas banyak noise dan hanya menyimpan:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]