Sua solução pode ser simplificada um pouco mais:
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%';
Ou ainda mais simples, com
jsonb_array_elements()
já que você não precisa do tipo de linha (foo
) neste exemplo: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 aqui
Mas isso não o que você perguntou exatamente:
Você está retornando todos os elementos da matriz JSON (0-n por linha da tabela base), onde uma chave específica (
'{payload,details,*,name}'
) corresponde (com distinção entre maiúsculas e minúsculas). E sua pergunta original tinha uma matriz JSON aninhada em cima disso. Você removeu a matriz externa para esta solução - eu fiz o mesmo.
Dependendo de seus requisitos reais, o novo recurso de pesquisa de texto do Postgres 10 pode ser útil.