आपके समाधान को कुछ और सरल बनाया जा सकता है:
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 प्रति आधार तालिका पंक्ति) को वापस कर रहे हैं, जहां एक विशेष कुंजी ('{payload,details,*,name}'
) मिलान (केस-संवेदी रूप से)।
और आपके मूल प्रश्न में इसके ऊपर एक नेस्टेड JSON सरणी थी। आपने इस समाधान के लिए बाहरी सरणी को हटा दिया - मैंने वही किया।
आपकी वास्तविक आवश्यकताओं के आधार पर नई टेक्स्ट खोज क्षमता पोस्टग्रेज 10 उपयोगी हो सकता है।