Následující původní odpověď platí pouze pro Postgres 9.3. Odpověď na Postgres 9.4 najdete v aktualizaci níže.
Toto staví na Erwinových odkazovaných odpovědích , ale je k této otázce trochu explicitnější.
ID jsou v tomto případě bigint
s, takže vytvořte pomocnou funkci pro převod pole JSON na Postgres bigint
pole:
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;
Mohli jsme jednoduše (a možná více znovupoužitelně) vrátit text
pole zde místo toho. Mám podezření na indexování na bigint
je mnohem rychlejší než text
ale mám problém najít online důkazy, které by to podpořily.
Pro vytvoření indexu:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
Pro dotazování to funguje a používá index:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Toto bude také fungovat pro dotazování, ale nepoužívá index:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Aktualizace na verzi 9.4
Postgres 9.4 představil jsonb
typ. Toto je dobrá odpověď SO o jsonb a kdy byste jej měli používat přes
. Stručně řečeno, pokud se někdy dotazujete na JSON, měli byste použít json
jsonb
.
Pokud sloupec vytvoříte jako jsonb
, můžete použít tento dotaz:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
is Postgres' obsahuje operátor, dokumentováno pro jsonb
zde
.Díky Alainově odpovědi
za to, že jste mě na to upozornili.