9.4 या नए को पोस्ट करता है
स्पष्ट रूप से इस पोस्ट से प्रेरित , Postgres 9.4 ने लापता फ़ंक्शन (ओं) को जोड़ा:
पैच के लिए लॉरेंस रो और धन्यवाद के लिए एंड्रयू डंस्टन!
JSON सरणी को अनावश्यक करने के लिए। तब का उपयोग array_agg()
या एक ARRAY निर्माता एक Postgres का निर्माण करने वालों से। या string_agg()
एक text
स्ट्रिंग बनाने के लिए ।
एक LATERAL
या सहसंबद्ध उपश्रेणी में प्रति पंक्ति अनावश्यक तत्वों को एकत्र करें । फिर मूल आदेश संरक्षित है और हम की जरूरत नहीं है ORDER BY
, GROUP BY
या यहाँ तक कि बाहरी क्वेरी में एक अद्वितीय कुंजी। देख:
jsonb
निम्नलिखित सभी SQL कोड के लिए 'jsonb' के साथ 'json' को बदलें ।
SELECT t.tbl_id, d.list
FROM tbl t
CROSS JOIN LATERAL (
SELECT string_agg(d.elem::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') AS d(elem)
) d;
लघु वाक्य रचना:
SELECT t.tbl_id, d.list
FROM tbl t, LATERAL (
SELECT string_agg(value::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') -- col name default: "value"
) d;
सम्बंधित:
एआरएवाईवाई सहसंबद्ध उप-निर्माण में:
SELECT tbl_id, ARRAY(SELECT json_array_elements_text(t.data->'tags')) AS txt_arr
FROM tbl t;
सम्बंधित:
सूक्ष्म अंतर : null
तत्वों को वास्तविक सरणियों में संरक्षित किया जाता है । एक text
स्ट्रिंग का निर्माण करने वाले उपरोक्त प्रश्नों में यह संभव नहीं है , जिसमें null
मान शामिल नहीं हो सकते हैं । सच प्रतिनिधित्व एक सरणी है।
समारोह आवरण
बार-बार उपयोग के लिए, इसे और भी सरल बनाने के लिए, किसी फ़ंक्शन में तर्क को इनकैप्सुलेट करें:
CREATE OR REPLACE FUNCTION json_arr2text_arr(_js json)
RETURNS text[] LANGUAGE sql IMMUTABLE AS
'SELECT ARRAY(SELECT json_array_elements_text(_js))';
इसे SQL फ़ंक्शन करें , ताकि बड़े प्रश्नों में इनबिल्ट किया जा सके ।
इसे बनाएं IMMUTABLE
(क्योंकि यह है) बड़े प्रश्नों में बार-बार मूल्यांकन से बचने के लिए और इसे इंडेक्स अभिव्यक्तियों में अनुमति दें।
कॉल करें:
SELECT tbl_id, json_arr2text_arr(data->'tags')
FROM tbl;
db <> फिडल यहां
9.3 या उससे अधिक उम्र के पोस्टग्रेट्स
फ़ंक्शन का उपयोग करें json_array_elements()
। लेकिन हमें इसमें से दोहरे उद्धरण दिए गए हैं।
बाहरी क्वेरी में एकत्रीकरण के साथ वैकल्पिक क्वेरी। CROSS JOIN
गायब या खाली सरणियों के साथ पंक्तियों को निकालता है। प्रसंस्करण तत्वों के लिए भी उपयोगी हो सकता है। हमें समग्र करने के लिए एक अद्वितीय कुंजी चाहिए:
SELECT t.tbl_id, string_agg(d.elem::text, ', ') AS list
FROM tbl t
CROSS JOIN LATERAL json_array_elements(t.data->'tags') AS d(elem)
GROUP BY t.tbl_id;
ARRAY कंस्ट्रक्टर, अभी भी उद्धृत स्ट्रिंग्स के साथ:
SELECT tbl_id, ARRAY(SELECT json_array_elements(t.data->'tags')) AS quoted_txt_arr
FROM tbl t;
ध्यान दें कि null
ऊपर के विपरीत, पाठ मान "null" में परिवर्तित हो गया है। गलत, सख्ती से बोलना, और संभावित अस्पष्ट।
गरीब आदमी के साथ निर्विवाद trim()
:
SELECT t.tbl_id, string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
GROUP BY 1;
Tbl से एकल पंक्ति को पुनः प्राप्त करें:
SELECT string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
WHERE t.tbl_id = 1;
स्ट्रिंग्स फॉर्म सहसंबद्ध उपश्रेणी:
SELECT tbl_id, (SELECT string_agg(trim(value::text, '"'), ', ')
FROM json_array_elements(t.data->'tags')) AS list
FROM tbl t;
ARRAY निर्माता:
SELECT tbl_id, ARRAY(SELECT trim(value::text, '"')
FROM json_array_elements(t.data->'tags')) AS txt_arr
FROM tbl t;
मूल (पुराना) SQL फिडेल ।
db <> फिडल यहां।
सम्बंधित:
नोट्स (पुराना 9.4 से पुराना)
हमें JSON सरणी से उचित मान वापस करने json_array_elements_text(json)
के json_array_elements(json)
लिए a , ट्विन की text
आवश्यकता होगी। लेकिन यह JSON फ़ंक्शन प्रदान किए गए शस्त्रागार से गायब प्रतीत होता है । या text
अदिश JSON
मान से मान निकालने के लिए कुछ अन्य कार्य । मुझे लगता है कि एक भी याद आ रही है।
इसलिए मैंने इसके साथ सुधार किया trim()
, लेकिन यह गैर-तुच्छ मामलों के लिए विफल हो जाएगा ...
json_extract_path_text(your_column, 'tags')
आप के लिए क्या देख रहे हैं?