Die folgende ursprüngliche Antwort gilt nur für Postgres 9.3. Eine Antwort auf Postgres 9.4 finden Sie im Update unten.
Dies baut auf Erwins referenzierten Antworten auf , geht aber etwas expliziter auf diese Frage ein.
Die IDs sind in diesem Fall bigint
s, erstellen Sie also eine Hilfsfunktion zum Konvertieren eines JSON-Arrays in ein Postgres-bigint
Array:
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;
Wir hätten einfach (und vielleicht besser wiederverwendbar) einen text
zurückgeben können Array stattdessen hier. Ich vermute die Indizierung auf bigint
ist viel schneller als text
aber es fällt mir schwer, online Beweise dafür zu finden.
Zum Erstellen des Indexes:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
Für Abfragen funktioniert dies und verwendet den Index:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Dies funktioniert auch für Abfragen, verwendet jedoch nicht den Index:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Update für 9.4
Postgres 9.4 hat den jsonb
eingeführt Typ. Dies ist eine gute SO-Antwort zu jsonb
und wann Sie es über json
verwenden sollten
. Kurz gesagt, wenn Sie jemals JSON abfragen, sollten Sie jsonb
verwenden .
Wenn Sie Ihre Spalte als jsonb
erstellen , können Sie diese Abfrage verwenden:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
Der @>
ist der Contains-Operator von Postgres, dokumentiert für jsonb
hier
.Dank an Alains Antwort
dass Sie mich darauf aufmerksam gemacht haben.