json
पोस्टग्रेज 9.3
. में यह पृष्ठ 9.3 में कठिन है, क्योंकि उपयोगी कार्यक्षमता अनुपलब्ध है।
विधि 1
LEFT JOIN LATERAL
में अननेस्ट करें (स्वच्छ और मानक-अनुरूप), json
. से दोहरे उद्धरणों को ट्रिम करें text
. पर कास्ट करने के बाद . नीचे दिए गए लिंक देखें।
SELECT DISTINCT ON (1)
t.id, t.name, d.last
FROM tbl t
LEFT JOIN LATERAL (
SELECT ('[' || d::text || ']')::json->>0 AS last
FROM json_array_elements(t.data) d
) d ON d.last <> t.name
ORDER BY 1, row_number() OVER () DESC;
हालांकि यह काम करता है, और मैंने इसे कभी विफल नहीं देखा है, अनचाहे तत्वों का क्रम अनियंत्रित व्यवहार पर निर्भर करता है। नीचे दिए गए लिंक देखें!json
. से रूपांतरण में सुधार करने के लिए text
अभिव्यक्ति के साथ टिप्पणी में @pozs द्वारा प्रदान किया गया
. अभी भी हैकिश, लेकिन सुरक्षित होना चाहिए।
विधि 2
SELECT DISTINCT ON (1)
id, name, NULLIF(last, name) AS last
FROM (
SELECT t.id, t.name
,('[' || json_array_elements(t.data)::text || ']')::json->>0 AS last
, row_number() OVER () AS rn
FROM tbl t
) sub
ORDER BY 1, (last = name), rn DESC;
SELECT
में अननेस्ट करें सूची (गैर-मानक)।- पंक्ति संख्या संलग्न करें (
rn
) समानांतर में (अधिक विश्वसनीय)। text
में कनवर्ट करें ऊपर की तरह।- अभिव्यक्ति
(last = name)
ORDER BY
. में क्लॉज मिलान नामों को अंतिम रूप देता है (लेकिन NULL से पहले)। तो एक मिलान नाम केवल तभी चुना जाता है जब कोई अन्य नाम उपलब्ध न हो। अंतिम लिंक नीचे।SELECT
में सूची,NULLIF
मेल खाने वाले नाम कोNULL
. से बदल देता है , ऊपर के समान परिणाम पर पहुंचना।
json
या jsonb
पोस्टग्रेज 9.4
. में पृष्ठ 9.4 सभी आवश्यक सुधारों को शिप करता है:
SELECT DISTINCT ON (1)
t.id, t.name, d.last
FROM tbl t
LEFT JOIN LATERAL json_array_elements_text(data) WITH ORDINALITY d(last, rn)
ON d.last <> t.name
ORDER BY d.rn DESC;
jsonb_array_elements_text()
का उपयोग करें jsonb
. के लिए . बाकी सब वही।
json / jsonb मैनुअल में कार्य करता है
अधिक स्पष्टीकरण के साथ संबंधित उत्तर:
- json array को postgres array में कैसे बदलें?
- PostgreSQL unnest() एलिमेंट नंबर के साथए>
- JSON सरणी में तत्व खोजने के लिए अनुक्रमणिका
- में समय आधारित प्राथमिकता सक्रिय रिकॉर्ड क्वेरी
- पहले चुनें प्रत्येक ग्रुप बाय ग्रुप में पंक्ति?