次の元の回答は、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
の場合 ここ
。