Postgres 9.3でjsonフィールドにインデックスを作成する方法


111

PostgreSQL 9.3 Beta 2(?)では、JSONフィールドにインデックスを作成するにはどうすればよいですか?使用した->演算子を使用して試してみましhstoreたが、次のエラーが発生しました:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

エラー:データ型jsonにはアクセスメソッド "btree"のデフォルト演算子クラスがありませんヒント:インデックスの演算子クラスを指定するか、データ型のデフォルト演算子クラスを定義する必要があります。


8
「質問はどこにあるの?」-タイトル内
rlib

2
将来的には、stackoverflow.com / tags / postgresql / infoの「より良い質問をする」セクションをご覧ください。煩わしい質問を減らし、より良い回答をより早く得るのに役立つかもしれません。
クレイグリンガー2013

回答:


184

見つかった:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

コメントで述べたように、ここでの微妙な違いはでは->>なくです->。前者は値をテキストとして、後者はJSONオブジェクトとして返します。



38
違いを探している場合に備えて:の->>代わりです->。前者はテキストとして値を返し、後者はJSONオブジェクトを返します。
Daniel Rikowski 2013年

34
二重括弧も重要です。
2014年

11
@Jac_opo ただし、としてTEXT抽出さます。文字列比較ではなく整数比較を行う場合は、キャストを追加する必要があります((info->>'name')::INT)
jpmc26

13
JSON列のサブオブジェクト内のフィールドにインデックスを作成する場合は、@ DanielRikowskiのおかげで、次のようにする必要があることがわかりました。create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));まず->JSONオブジェクトを取得するために使用し、次に子->>オブジェクトの値を取得する必要があります。テキスト。
Corey Cole
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.