これは非常に基本的な質問かもしれませんが、このオンラインで何も見つけることができません。
サンプルテーブルを作成した場合:
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フィールドから整数値を取得できる唯一の方法ですか?その場合、データが非常に大きくなってもパフォーマンスに影響はありませんか?
ここで何か不足しているのですか、それとも型キャストがjsonフィールドから整数値を取得できる唯一の方法ですか?
正解です。jcastフィールドから整数値を読み取る唯一の方法は型キャストです。
その場合、データが非常に大きくなってもパフォーマンスに影響はありませんか?
Postgresを使用すると、キャストを含む関数にインデックスを付けることができるため、以下のインデックスを使用すると、data->> xに整数値があるすべての行をすばやく取得できます
CREATE INDEX dummy_x_idx ON dummy(cast("data"->>'x' AS int))
JSON演算子->>
は JSON配列要素(またはオブジェクトフィールド)をテキストとして取得する、 なので、型キャストが必要です。
独自のJSON演算子を定義することもできますが、パフォーマンスに影響を与えることなく、コードを単純化するだけです。