2010-08-11 10 views
17

में array_agg के साथ बनाए गए एक पाठ को क्रमबद्ध करें मेरे पास postgresql में एक तालिका है। निम्न तालिका "पशुओं" मेरी समस्या समझाने की कोशिश करेंगे:postgresql

name 
------ 
tiger 
cat 
dog 

अब मैं निम्न क्वेरी का उपयोग कर रहा:

SELECT 
    array_to_string(array_agg("name"), ', ') 
FROM 
    animals; 

परिणाम है: "बाघ, बिल्ली, कुत्ते"। लेकिन मैं एक स्ट्रिंग में परिवर्तित होने से पहले कुल को सॉर्ट करना चाहता हूं। तो यह परिणाम मैं उम्मीद कर रहा हूँ:

"cat, dog, tiger". 

तो मैं इसे कैसे एक स्ट्रिंग को परिवर्तित करने से पहले PostgreSQL 8.4 में एक स्ट्रिंग सरणी सॉर्ट कर सकते हैं। ऑर्डर "पंक्ति" पंक्ति पर काम नहीं करता है और अंतर्निहित सॉर्ट फ़ंक्शन केवल पूर्णांक मानों को संसाधित करता है।

कोई भी एक अच्छा विचार है, शुद्ध एसक्यूएल में इसे कैसे हल करें?

एक बहुत रिचर्ड

उत्तर

11

यह PostgreSQL 9.0 में उपलब्ध हो जाएगा:

http://www.postgresql.org/docs/9.0/static/release-9-0.html, धारा E.1.3.6.1।

SELECT array_agg(animal_name) 
FROM (
    SELECT "name" AS animal_name 
    FROM animals 
    ORDER BY "name" 
) AS sorted_animals; 
+0

यह करेगा! और यह जानकर बहुत खुशी हुई कि इसे 9.0 में लागू किया जाएगा। – Richard

0

आप सरणी पर generate_series() उपयोग करने के लिए, और फिर उस परिणाम पर एक SELECT...ORDER BY (या बस घोंसला यह SELECT के अंदर) कर इससे पहले कि आप एक स्ट्रिंग के लिए कनवर्ट करने की कोशिश की Thanx?

+0

मैंने इसे अभी घोंसला दिया। उप-चयन ने मुझे आवश्यक जादू किया था। – Richard

3

हालांकि मैथ्यू लकड़ी के जवाब आपके मामले के लिए बेहतर है, यहाँ है में सरणियों सॉर्ट करने के लिए एक तरह से: समुच्चय

इस दौरान, आप जो समस्या (भद्दा यद्यपि) का समाधान हो सकता कुछ इस तरह कर सकता है PostgreSQL 8.4 और ऊपर:

SELECT array(
    SELECT unnest(array[3,2,1]) AS x ORDER BY x 
); 

को जानने का array और unnest कार्यों सुविधाजनक हो सकता है, क्योंकि यह भी आप एक सरणी से अधिक "map" तरह बातें करने देता है:

SELECT array(
    SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery 
); 

फिर से, यह पोस्टग्रेएसक्यूएल 8.4 की कीमत के लिए आपका हो सकता है।

+0

एक महान कामकाज मैं ध्यान में रखूंगा। आपका बहुत बहुत धन्यवाद। – Richard

39

PostgreSQL 9.0 and later के लिए, आप एक समग्र अभिव्यक्ति में एक ORDER BY खंड का उपयोग कर सकते हैं:

SELECT 
    array_to_string(array_agg(name ORDER BY name), ', ') 
FROM 
    animals; 

इसके अलावा, अपने विशिष्ट प्रयोजन के लिए, आप string_agg उपयोग कर सकते हैं आपकी क्वेरी को आसान बनाने: फिर भी

SELECT 
    string_agg(name, ', ' ORDER BY name) 
FROM 
    animals; 
+0

संकेत के लिए धन्यवाद! – Richard

0

, संस्करण 8.4 के लिए, मैथ्यू वुड द्वारा सुझाए गए समाधान का उपयोग करके, यदि आपको बाहरी क्वेरी में समूहबद्ध करने की आवश्यकता है, तो सॉर्टिंग को सुसंगत होने के लिए, आंतरिक क्वेरी को भी हल किया जाना चाहिए।

SELECT family, array_agg(animal_name) 
FROM (
    SELECT family, "name" AS animal_name 
    FROM animals 
    ORDER BY family, "name" 
) AS sorted_animals 
group by family;