Följande originalsvar gäller endast för Postgres 9.3. För ett Postgres 9.4-svar, se uppdateringen nedan.
Detta bygger på Erwins refererade svar , men är lite mer explicit i denna fråga.
ID:n i det här fallet är bigint
s, så skapa en hjälpfunktion för att konvertera en JSON-array till 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 kunde enkelt (och kanske mer återanvändbart) ha returnerat en text
array här istället. Jag misstänker indexering på bigint
är mycket snabbare än text
men jag har svårt att hitta bevis på nätet som styrker det.
För att bygga indexet:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
För förfrågningar fungerar detta och använder indexet:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Att göra detta kommer också att fungera för sökning, men det använder inte index:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Uppdatering för 9.4
Postgres 9.4 introducerade jsonb
typ. Detta är ett bra SO-svar om jsonb och när du ska använda den över
. Kort sagt, om du någonsin frågar efter JSON, bör du använda json
jsonb
.
Om du bygger din kolumn som jsonb
, kan du använda den här frågan:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
är Postgres innehåller operatör, dokumenterad för jsonb
här
.Tack vare Alains svar
för att du uppmärksammade mig på detta.