web-dev-qa-db-ja.com

where句でjsonサブ要素を使用するpostgresql

これは非常に基本的な質問かもしれませんが、このオンラインで何も見つけることができません。

サンプルテーブルを作成した場合:

 create table dummy ( id int not null, data json );

次に、次のクエリを使用してテーブルをクエリすると、

select * from dummy where data->'x' = 10;

テーブルにはまだレコードがなく、どのレコードにも「x」などのプロパティがないため、結果はゼロになります。

しかし、私は次のエラーを受け取ります:

postgres=# select * from dummy where data->'x' = 10;
ERROR:  operator does not exist: json = integer
LINE 1: select * from dummy where data->'x' = 10;

ただし、次のクエリは機能します。

select * from dummy where cast(data->>'x' as integer) = 10;

ここで何か不足しているのですか、それとも型キャストがjsonフィールドから整数値を取得できる唯一の方法ですか?その場合、データが非常に大きくなってもパフォーマンスに影響はありませんか?

21
Mandeep Singh

ここで何か不足しているのですか、それとも型キャストがjsonフィールドから整数値を取得できる唯一の方法ですか?

正解です。jcastフィールドから整数値を読み取る唯一の方法は型キャストです。

その場合、データが非常に大きくなってもパフォーマンスに影響はありませんか?

Postgresを使用すると、キャストを含む関数にインデックスを付けることができるため、以下のインデックスを使用すると、data->> xに整数値があるすべての行をすばやく取得できます

CREATE INDEX dummy_x_idx ON dummy(cast("data"->>'x' AS int))
15
FuzzyTree

JSON演算子->>JSON配列要素(またはオブジェクトフィールド)をテキストとして取得する なので、型キャストが必要です。

独自のJSON演算子を定義することもできますが、パフォーマンスに影響を与えることなく、コードを単純化するだけです。

5
klin