次の元の回答は、Postgres9.3にのみ適用されます。 Postgres 9.4の回答については、以下の更新を参照してください。
これは、Erwinが参照した回答 に基づいています。 、しかし、この質問にはもう少し明確です。
この場合のIDは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;
text を簡単に(そしておそらくもっと再利用可能に)返すことができたはずです。 代わりにここに配列します。 bigintでのインデックス作成が疑われます textよりもはるかに高速です しかし、それを裏付ける証拠をオンラインで見つけるのに苦労しています。
インデックスを作成する場合:
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のアップデート
Postgres9.4はjsonbを導入しました タイプ。 これはjsonbについての良い答えですコード>
。つまり、JSONをクエリする場合は、 jsonで使用する必要がある場合 jsonbを使用する必要があります。 。
jsonbとして列を作成する場合 、次のクエリを使用できます:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@> is Postgres'には演算子が含まれ、 jsonbの場合 ここ
。