Poniższa oryginalna odpowiedź dotyczy tylko Postgres 9.3. Aby uzyskać odpowiedź na Postgres 9.4, zobacz aktualizację poniżej.
Jest to oparte na odpowiedziach Erwina , ale to pytanie jest nieco bardziej wyraźne.
Identyfikatory w tym przypadku to duże
s, więc utwórz funkcję pomocniczą do konwersji tablicy JSON na bigint
Postgresa tablica:
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;
Moglibyśmy po prostu łatwo (i być może bardziej do ponownego wykorzystania) zwrócić tekst
zamiast tego tablica. Podejrzewam, że indeksowanie w bigint
jest dużo szybszy niż text
ale mam trudności ze znalezieniem dowodów online na poparcie tego.
Aby zbudować indeks:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
W przypadku zapytań to działa i używa indeksu:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
Wykonanie tego zadziała również w przypadku zapytań, ale nie używa indeksu:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
Aktualizacja do wersji 9.4
Postgres 9.4 wprowadził jsonb
rodzaj. To dobra odpowiedź na temat jsonb i kiedy należy go używać w
. Krótko mówiąc, jeśli kiedykolwiek pytasz o JSON, powinieneś użyć json
jsonb
.
Jeśli zbudujesz swoją kolumnę jako jsonb
, możesz użyć tego zapytania:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@> is Postgres' zawiera operator, udokumentowany dla
jsonb
tutaj
.Dzięki odpowiedzi Alaina
za zwrócenie mi na to uwagi.