json_array_elements
के बजाय json_array_elements_text आज़माएं , और आपको टेक्स्ट के लिए स्पष्ट कास्टिंग की आवश्यकता नहीं है (x::text
), ताकि आप इसका उपयोग कर सकें:
CREATE or replace FUNCTION json_array_castext(json) RETURNS text[] AS $f$
SELECT array_agg(x) FROM json_array_elements_text($1) t(x);
$f$ LANGUAGE sql IMMUTABLE;
आपके अतिरिक्त प्रश्न के लिए
<ब्लॉकक्वॉट>क्यों x::text कास्ट नहीं है?
यह डाला जाता है और इस वजह से, यह कोई त्रुटि नहीं दे रहा है, लेकिन जब जेसन स्ट्रिंग को इस तरह से टेक्स्ट में कास्टिंग करते हैं:::text
, पोस्टग्रेज मूल्य में उद्धरण जोड़ता है।
केवल परीक्षण उद्देश्यों के लिए, अपने फ़ंक्शन को फिर से मूल में बदलें (जैसा कि आपके प्रश्न में है) और कोशिश करें:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
जैसा कि आप देखते हैं, (json_array_castext('["hello","world"]'))[1]
देता है "hello"
hello
. के बजाय . और यही कारण है कि आपको false
मिला है उन मानों की तुलना करते समय।