Следният оригинален отговор се прилага само за Postgres 9.3. За отговор на Postgres 9.4 вижте актуализацията по-долу.
Това се основава на референтните отговори на Erwin , но е малко по-ясен за този въпрос.
Идентификаторите в този случай са bigint
s, така че създайте помощна функция за преобразуване на JSON масив в Postgres bigint
масив:
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;
Можехме просто да върнем текст
лесно (и може би по-лесно за повторна употреба). масив тук вместо това. Подозирам индексиране на bigint
е много по-бърз от текст
но ми е трудно да намеря онлайн доказателства в подкрепа на това.
За изграждане на индекса:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
За заявки това работи и използва индекса:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Правейки това също ще работи за заявки, но не използва индекса:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Актуализация за 9.4
Postgres 9.4 представи jsonb
Тип. Това е добър SO отговор за jsonbкод> и кога трябва да го използвате върху
. Накратко, ако някога правите заявки за JSON, трябва да използвате json
jsonb
.
Ако изградите колоната си като jsonb
, можете да използвате тази заявка:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
е Postgres' съдържа оператор, документиран за jsonb
тук
.Благодарение на отговора на Ален
за това, че ми обърнахте внимание.