ソリューションをさらに簡素化できます:
SELECT r.res->>'name' AS feature_name, d.name AS detail_name
FROM restaurants r
, jsonb_populate_recordset(null::foo, r.res #> '{payload, details}') d
WHERE d.name LIKE '%oh%';
または、もっと簡単ですが、 jsonb_array_elements()
実際には行タイプ(foo
は必要ないため) )この例ではまったく:
SELECT r.res->>'name' AS feature_name, d->>'name' AS detail_name
FROM restaurants r
, jsonb_array_elements(r.res #> '{payload, details}') d
WHERE d->>'name' LIKE '%oh%';
dbfiddle こちら
しかし、それはではありません 質問 正確に:
すべてのJSON配列要素(ベーステーブル行ごとに0〜n)を返します。ここで、1つの特定のキー('{payload,details,*,name}'
)一致します(大文字と小文字を区別します)。
そして、元の質問には、この上にネストされたJSON配列がありました。このソリューションの外部アレイを削除しました-私も同じことをしました。
実際の要件に応じて、新しいテキスト検索機能Postgres10の 役に立つかもしれません。