SQL क्वेरी सभी मानों को प्राप्त करने के लिए एक enum हो सकती है


140

कुछ समय पहले Postgresql को एनम सपोर्ट मिला।

CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);

मैं एक क्वेरी के साथ एनम में निर्दिष्ट सभी मान कैसे प्राप्त करूं?


मुझे निम्नलिखित उत्तर भी बहुत मददगार लगे हैं: stackoverflow.com/questions/9540681/list-postgres-enum-type
अनाम कायर

जवाबों:


264

यदि आप एक सरणी चाहते हैं:

SELECT enum_range(NULL::myenum)

यदि आप enum में प्रत्येक आइटम के लिए एक अलग रिकॉर्ड चाहते हैं:

SELECT unnest(enum_range(NULL::myenum))  

अतिरिक्त जानकारी

यह समाधान अपेक्षा के अनुसार काम करता है, भले ही आपका एनम डिफ़ॉल्ट स्कीमा में न हो। उदाहरण के लिए, के myenumसाथ बदलें myschema.myenum

उपरोक्त क्वेरी में दिए गए रिकॉर्ड का डेटा प्रकार होगा myenum। आप जो कर रहे हैं, उसके आधार पर आपको पाठ करने की आवश्यकता हो सकती है। जैसे

SELECT unnest(enum_range(NULL::myenum))::text

यदि आप कॉलम नाम निर्दिष्ट करना चाहते हैं, तो आप जोड़ सकते हैं AS my_col_name


जस्टिन ओम्स को कुछ अतिरिक्त युक्तियों को इंगित करने का श्रेय, जिसे मैंने अपने उत्तर में शामिल किया।


1
यह उत्तर अधिक संक्षिप्त है। अच्छा योगदान!
डारिन पीटरसन

3
अनावश्यक कॉल "मायेनम" के कॉलम नाम के साथ टाइप मायेनम के रिकॉर्ड लौटाएगा। आप एनम को टेक्स्ट में डालना चाहते हैं और कुछ ऐसा जोड़कर कॉलम नाम निर्दिष्ट कर सकते हैं। :: पाठ के रूप में my_column
जस्टिन

1
Enum फ़ंक्शन के बारे में अधिक जानने के लिए आप इस लिंक को देख सकते हैं postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-arn.html
बिकल बेसनेट

1
का अर्थ क्या है NULL::?
चो

1
@ क्रिसल धन्यवाद। यह बहुत अजीब लगता है। हम क्यों नहीं कर सकते SELECT enum_range(myenum)? कास्टिंग का मतलब क्या है null?
सुंग चो

31

प्रयत्न:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'

1
यदि आपके पास एक से अधिक स्कीमा में समान एनुम है, तो इसे थोड़ा कम करना पड़ सकता है। यदि ऐसा है, तो विवरण के लिए postgresql.org/docs/current/static/catalog-pg-type.html देखें।
केव

1
मुझे लगता है कि आपको अंडरस्कोर के साथ 'मायेनम' को उपसर्ग करने की आवश्यकता है। यदि आपको एनम मान प्राप्त करने की आवश्यकता है तो मेरे उत्तर की जाँच करें और एक से अधिक स्कीमा में एनम नाम का उपयोग किया जा सकता है।
डेविड अंडरहिल

यदि गणना क्रम महत्वपूर्ण है, ORDER BY e.enumsortorderतो क्वेरी में संलग्न करें। प्रगणित मूल्यों सबसे अधिक संभावना के आदेश से बाहर हो सकता है अगर नए मूल्यों का उपयोग कर गणना प्रकार में डाला गया BEFOREया AFTER
क्लिंट पच

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

यह एनम "your_enum" की सामग्री के सेट का एक सिंगल कॉलम परिणाम लौटाएगा जिसमें टाइप टेक्स्ट का "your_column" नाम का कॉलम होगा।


4

आप निम्नलिखित क्वेरी का उपयोग करके एनम के लिए सभी एनम मान प्राप्त कर सकते हैं। क्वेरी आपको यह चुनने देती है कि Enum किस नाम स्थान पर रहता है (जो आवश्यक है यदि enum को कई नामस्थानों में परिभाषित किया गया है, अन्यथा आप क्वेरी के उस भाग को छोड़ सकते हैं)।

SELECT enumlabel
FROM pg_enum
WHERE enumtypid=(SELECT typelem
                 FROM pg_type
                 WHERE typname='_myenum' AND
                 typnamespace=(SELECT oid
                               FROM pg_namespace
                               WHERE nspname='myschema'))

1
आपका क्या मतलब है कि यह सरणी प्रकार है? यह मेरे लिए काम करता है (PostgreSQL 9.0)।
डेविड अंडरहिल

+1 यह मेरे लिए काम कर रहा है जबकि @ केव का उत्तर मेरे डीबी में स्कीमा के उपयोग के कारण नहीं था।
user9645
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.