Giải pháp của bạn có thể được đơn giản hóa một số chi tiết:
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%';
Hoặc đơn giản hơn, với jsonb_array_elements()
vì bạn không thực sự cần loại hàng (foo
) hoàn toàn trong ví dụ này:
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 tại đây
Nhưng đó không những gì bạn đã hỏi chính xác:
Bạn đang trả về tất cả các phần tử mảng JSON (0-n trên mỗi hàng của bảng cơ sở), trong đó một khóa cụ thể ('{payload,details,*,name}'
) khớp (phân biệt chữ hoa chữ thường).
Và câu hỏi ban đầu của bạn có một mảng JSON lồng vào nhau. Bạn đã xóa mảng bên ngoài cho giải pháp này - Tôi cũng làm như vậy.
Tùy thuộc vào yêu cầu thực tế của bạn, khả năng tìm kiếm văn bản mới trong tổng số Postgres 10 có thể hữu ích.