मेरी तालिका trips की एक पंक्ति में मेरे jsonb फ़ील्ड itineraries का मेरा डेटा नमूना यहां दिया गया है:

[
    {
        "nights": 10,
        "destinations": [
            "Cronaside",
            "New Emory",
            "East Mattiechester"
        ],
        "departure_date_end": "2020-09-21",
        "return_date_latest": "2020-10-01",
        "departure_date_start": "2020-09-14"
    },
    {
        "nights": 10,
        "destinations": [
            "Port Verdie",
            "Chaunceymouth",
            "Isabellemouth"
        ],
        "departure_date_end": "2020-10-08",
        "return_date_latest": "2020-10-18",
        "departure_date_start": "2020-09-14"
    }
]

मेरा उद्देश्य इस jsonb फ़ील्ड itineraries के जल्द से जल्द departure_date_start द्वारा आदेशित trips से पंक्तियों को वापस करना है। यहाँ मेरा सरल प्रयास है:

SELECT * 
from trips
ORDER BY itineraries->>'departure_date_start' ASC 

हालाँकि, क्योंकि itineraries एक सरणी है और इसमें कई departure_date_start मान हो सकते हैं, क्या Postgres इसे स्वचालित रूप से संभालता है? या क्या मुझे सरणी पर लूप करने की आवश्यकता है?

पोस्टग्रेज 9.6 . का उपयोग करना

2
f7n 6 सितंबर 2020, 16:28

1 उत्तर

सबसे बढ़िया उत्तर

आपको सरणी का विस्तार करने की आवश्यकता है।

select t.*
  from trips t
 cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
 order by i.datel->>'departure_date_start'; 

यह प्रति ट्रिप कई पंक्तियाँ लौटाएगा।

यदि आप परिणाम को प्रति ट्रिप केवल एक पंक्ति तक सीमित करना चाहते हैं, तो आप उन स्तंभों के आधार पर समूह बना सकते हैं जिन्हें आप वापस कर रहे हैं:

select t.id, t.some_col, t.some_other_column, t.itineraries, 
       min(i.datel->>'departure_date_start') as departure_date_start
  from trips t
 cross join lateral jsonb_array_elements(t.itineraries) as i(datel)
 group by t.id, t.some_col, t.some_other_column, t.itineraries
 order by min(i.datel->>'departure_date_start')
0
Mike Organek 6 सितंबर 2020, 18:26