Det følgende originale svar gælder kun for Postgres 9.3. For et Postgres 9.4-svar, se opdateringen nedenfor.
Dette bygger på Erwins refererede svar , men er en smule mere eksplicit i forhold til dette spørgsmål.
ID'erne i dette tilfælde er bigint
s, så opret en hjælpefunktion til at konvertere et JSON-array til en 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;
Vi kunne bare nemt (og måske mere genbrugeligt) have returneret en tekst
række her i stedet. Jeg har mistanke om indeksering på bigint
er meget hurtigere end tekst
men jeg har svært ved at finde beviser online for at understøtte det.
Til opbygning af indekset:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
Til forespørgsel virker dette og bruger indekset:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
At gøre dette vil også fungere til forespørgsler, men det bruger ikke indekset:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Opdatering til 9.4
Postgres 9.4 introducerede jsonb
type. Dette er et godt SO-svar om jsonb og hvornår du skal bruge det over
. Kort sagt, hvis du nogensinde forespørger på JSON, bør du bruge json
jsonb
.
Hvis du bygger din kolonne som jsonb
, kan du bruge denne forespørgsel:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
er Postgres' indeholder operator, dokumenteret for jsonb
her
.Tak til Alains svar
for at gøre mig opmærksom på dette.