Din lösning kan förenklas ytterligare:
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%';
Eller ännu enklare med jsonb_array_elements()
eftersom du faktiskt inte behöver radtypen (foo
) alls i det här exemplet:
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 här
Men det är inte vad du frågade exakt:
Du returnerar alla JSON-arrayelement (0-n per bastabellrad), där en särskild nyckel ('{payload,details,*,name}'
) matchar (skiftlägeskänsligt).
Och din ursprungliga fråga hade en kapslad JSON-array ovanpå detta. Du tog bort den yttre arrayen för den här lösningen - jag gjorde samma sak.
Beroende på dina faktiska krav new textsökförmåga av Postgres 10 kan vara användbart.