जैसा कि त्रुटि संदेश कहता है, WHERE
. के लिए तर्क एक सेट वापस नहीं करना चाहिए। jsonb_array_elements
एक सेट देता है और इसकी तुलना किसी एक मान से नहीं की जा सकती। दूसरी क्वेरी में आपके पास चयन के अंदर एक क्रॉस जॉइन है और जो इसे WHERE
का उपयोग करने के लिए उपयुक्त परिणाम में परिवर्तित करता है। चालू।
आप इसे इस तरह भी कर सकते हैं
SELECT mydata.pk FROM mydata
WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');
यहां उप-चयन आपको IN
. का उपयोग करने की अनुमति देगा वांछित मूल्य खोजने के लिए ऑपरेटर क्योंकि परिणाम अब एक सेट नहीं है।
दूसरा तरीका सीधे jsonb को क्वेरी करना है
SELECT mydata.pk FROM mydata
WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;
इस तरह आपको jsonb को एक परिणामसेट में बदलने और उसमें खोजने की आवश्यकता नहीं है।