Jawaban asli berikut hanya berlaku untuk Postgres 9.3. Untuk jawaban Postgres 9.4, lihat Pembaruan di bawah.
Ini didasarkan pada jawaban referensi Erwin , tetapi sedikit lebih eksplisit untuk pertanyaan ini.
ID dalam hal ini adalah bigint
s, jadi buat fungsi pembantu untuk mengonversi larik JSON menjadi bigint
Postgres susunan:
CREATE OR REPLACE FUNCTION json_array_bigint(_j json)
RETURNS bigint[] AS
$$
SELECT array_agg(elem::text::bigint)
FROM json_array_elements(_j) AS elem
$$
LANGUAGE sql IMMUTABLE;
Kita bisa saja dengan mudah (dan mungkin lebih dapat digunakan kembali) mengembalikan text
array di sini sebagai gantinya. Saya menduga pengindeksan pada bigint
jauh lebih cepat daripada text
tapi saya kesulitan menemukan bukti online untuk mendukungnya.
Untuk membangun indeks:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
Untuk kueri, ini berfungsi dan menggunakan indeks:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Melakukan ini juga akan berfungsi untuk kueri, tetapi tidak menggunakan indeks:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Pembaruan untuk 9,4
Postgres 9.4 memperkenalkan jsonb
Tipe. Ini adalah jawaban SO yang bagus tentang jsonb
dan kapan Anda harus menggunakannya di atas json
. Singkatnya, jika Anda pernah menanyakan JSON, Anda harus menggunakan jsonb
.
Jika Anda membuat kolom sebagai jsonb
, Anda dapat menggunakan kueri ini:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
adalah Postgres' berisi operator, didokumentasikan untuk jsonb
di sini
.Terima kasih kepada Jawaban Alain
untuk membawa ini menjadi perhatian saya.