組み込みのjsonb
はありません 演算子も、この種のフィルターを直接(まだ)サポートしているインデックスもありません。
EXISTS
をお勧めします 半参加:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
冗長な評価と最終的なDISTINCT
を回避します ステップでは、プレーンな CROSS JOIN
で個別の行を取得する必要があります 。
それでも十分な速度が得られない場合は、特定のタイプのクエリに対してより洗練された特殊なソリューションとして、<の行ごとに一意の値の連結文字列(検索パターンに干渉しない区切り文字を使用)を抽出する方法があります。 code> IMMUTABLE 関数を作成し、関数式にトリグラムGINインデックスを作成し、クエリで同じ式を使用します。
関連:
- より大きな演算子を使用してjsonb配列でネストされた値を検索します
- レコードのJSONB配列でキーを含む行を検索する
- 配列サブオブジェクトにPostgresJSONBインデックスを作成する
余談ですが、 jsonb
値は実際には例のように見えます。多くのノイズをトリミングして保存するだけです。
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]