Saya memiliki meja untuk menyimpan informasi tentang kelinci saya. Ini terlihat seperti ini:
create table rabbits (rabbit_id bigserial primary key, info json not null);
insert into rabbits (info) values
('{"name":"Henry", "food":["lettuce","carrots"]}'),
('{"name":"Herald","food":["carrots","zucchini"]}'),
('{"name":"Helen", "food":["lettuce","cheese"]}');
Bagaimana cara menemukan kelinci yang suka wortel? Saya datang dengan ini:
select info->>'name' from rabbits where exists (
select 1 from json_array_elements(info->'food') as food
where food::text = '"carrots"'
);
Saya tidak suka kueri itu. Ini berantakan.
Sebagai pemelihara kelinci penuh waktu, saya tidak punya waktu untuk mengubah skema database saya. Saya hanya ingin memberi makan kelinci saya dengan benar. Apakah ada cara yang lebih mudah dibaca untuk melakukan kueri itu?
json
postgresql
postgresql-9.3
Semakin bertambah
sumber
sumber
Jawaban:
Pada PostgreSQL 9.4, Anda dapat menggunakan
?
operator :Anda bahkan dapat mengindeks
?
kueri pada"food"
kunci jika Anda beralih ke tipe jsonb sebagai gantinya:Tentu saja, Anda mungkin tidak punya waktu untuk itu sebagai pemelihara kelinci penuh waktu.
Pembaruan: Berikut adalah demonstrasi peningkatan kinerja di atas meja 1.000.000 kelinci di mana setiap kelinci menyukai dua makanan dan 10% dari mereka menyukai wortel:
sumber
select * from rabbits where info->'food' != '[]';
create table t (x jsonb); insert into t (x) values ('[1,2,3]'), ('[2,3,4]'), ('[3,4,5]'); select * from t where x @> '2';
. Perhatikan bahwa itu'2'
adalah nomor JSON; jangan disesatkan oleh kutipannya.Anda dapat menggunakan operator @> untuk melakukan ini seperti
sumber
'
centang di sekitar "wortel" ... wortel rusak jika Anda membiarkannya, bahkan jika Anda memeriksa bilangan bulat. (menghabiskan 3 jam mencoba menemukan bilangan bulat, membuatnya bekerja secara ajaib dengan membungkus'
kutu di sekitar angka)'
untuk membentuk string, karena semuanya adalah string untuk SQL dalam tipe JSONB. Sebagai contoh, boolean:'true'
, String:'"example"'
, integer:'123'
.Tidak lebih pintar tapi lebih sederhana:
sumber
Variasi kecil tapi tidak ada yang baru. Benar-benar kehilangan fitur ...
sumber