PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक postgresql तालिका से गतिशील रूप से एक JSON सरणी तत्व का चयन करने की आवश्यकता है

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 . से बदल देता है , ऊपर के समान परिणाम पर पहुंचना।

SQL Fiddle.

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 मैनुअल में कार्य करता है

अधिक स्पष्टीकरण के साथ संबंधित उत्तर:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संबंधित अनुक्रम को हटाए बिना PostgreSQL में एक तालिका को हटाना

  2. वर्तमान घंटे के डेटा का चयन पोस्टग्रेज

  3. पांडा अद्यतन sql

  4. वैकल्पिक पैरा पर पोस्टग्रेज कैसे पूछें?

  5. PostgreSQL में यूजर कैसे बनाएं