सूची ENUM प्रकार पोस्टग्रैट्स


98

सूची Enum प्रकार के लिए सुझाई गई क्वेरी महान है। लेकिन, यह केवल schemaऔर की सूची है typname। मैं वास्तविक ENUM मान कैसे सूचीबद्ध करूं? उदाहरण के लिए, ऊपर दिए गए लिंक किए गए उत्तर में, मैं निम्नलिखित परिणाम चाहता हूं

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'

जवाबों:


133
select n.nspname as enum_schema,  
       t.typname as enum_name,  
       e.enumlabel as enum_value
from pg_type t 
   join pg_enum e on t.oid = e.enumtypid  
   join pg_catalog.pg_namespace n ON n.oid = t.typnamespace

4
मीठा ... string_agg(e.enumlabel, ', ') as enum_valueउचित के साथ उपयोग करने के लिए और भी बेहतर GROUP BYs। बहुत धन्यवाद।
पंकिश

4
यह मज़ाकीय है। पृथ्वी पर कोई आशुलिपि क्यों नहीं है? (हालांकि समाधान के लिए धन्यवाद!)
dpb

92

आप के माध्यम से डेटा प्रकार सूचीबद्ध कर सकते हैं

\dT+ channels

https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS


@AlisonR। मेरा मानना ​​है कि लेखक एक sql सिंटैक्स की तलाश में था। इस उत्तर में समाधान केवल देशी पोस्टग्रे क्ले क्लाइंट के लिए अच्छा है।
स्लाव

70
select enum_range(enum_first(null::province),null::province);

11
एक आकर्षण की तरह काम किया, दूसरों के लिए, 'प्रांत' नाम का नाम है :)
राणा दीप

14
select unnest(enum_range(null, null::name_of_enum_type));प्रति पंक्ति एक मान प्राप्त करने के लिए उपयोग करें ।
ब्रायन एच

16
धन्यवाद! डॉक्स के अनुसार यदि आपको पूरी रेंज चाहिए तो आपको इसे दो बार दोहराने की आवश्यकता नहीं है select enum_range(null::my_enum)postgresql.org/docs/9.5/static/functions-enum.html
सैम ईटन

15

मैं हमेशा भूल जाता हूं कि यह कैसे करना है। अन्य उत्तर और टिप्पणी के अनुसार, यह एक अल्पविराम से अलग की गई सूची है। मुझे कॉपी-पेस्ट स्निपेट पसंद हैं। सहायता के लिए धन्यवाद:

select n.nspname as enum_schema,  
    t.typname as enum_name,
    string_agg(e.enumlabel, ', ') as enum_value
from pg_type t 
    join pg_enum e on t.oid = e.enumtypid  
    join pg_catalog.pg_namespace n ON n.oid = t.typnamespace
group by enum_schema, enum_name;

3

यह: SELECT unnest(enum_range(NULL::myenum))एनम प्रकारों को पंक्तियों के रूप में देता है।


0

@dpb:

यदि आप इसके लिए एक स्थायी आसान पहुँच विधि बनाना चाहते हैं, तो आप हमेशा एक दृश्य बना सकते हैं

CREATE OR REPLACE VIEW oublic.enumz AS 
 SELECT n.nspname AS enum_schema,
  t.typname AS enum_name,
  e.enumlabel AS enum_value
 FROM pg_type t
 JOIN pg_enum e ON t.oid = e.enumtypid
 JOIN pg_namespace n ON n.oid = t.typnamespace;

फिर आप सम्मिलित कमांड के लिए एक ट्रिगर बना सकते हैं।

उपरोक्त इसे भविष्य में संदर्भ उद्देश्यों के लिए डेटाबेस में संग्रहीत करेगा।


0

यह सभी एनुम-टाइप किए गए कॉलम और उनके संभावित मूल्यों को सूचीबद्ध करता है :

SELECT
  table_schema || '.' || table_name || '.' || column_name as field_name,
  pg_enum.enumlabel as value
FROM pg_type
  JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
  JOIN pg_namespace on pg_type.typnamespace = pg_namespace.oid
  JOIN information_schema.columns ON (information_schema.columns.udt_name = pg_type.typname AND information_schema.columns.udt_schema = pg_namespace.nspname)
WHERE pg_type.typtype = 'e'
ORDER BY field_name, pg_enum.enumsortorder;

0

आदेश जोड़ें

SELECT
  n.nspname AS enum_schema,
  t.typname AS enum_name,
  e.enumlabel AS enum_value
FROM
  pg_type t
  JOIN pg_enum e ON t.oid = e.enumtypid
  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
ORDER BY
  enum_name,
  e.enumsortorder;

-2

यदि आपके पास तालिका और स्तंभ नाम है, (लेकिन टाइप नाम नहीं) इसका उपयोग करें:

SELECT pg_enum.enumlabel
FROM pg_type
 JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
 JOIN information_schema.columns ON information_schema.columns.udt_name =
                                    pg_type.typname
WHERE pg_type.typtype = 'e' AND
      table_name = $1 AND column_name = $2 ORDER BY pg_enum.enumsortorder

यदि आप enum_rangeएक कॉलम पर उपयोग करते हैं (अन्य उत्तरों के विपरीत जो इसे एक प्रकार पर उपयोग करते हैं) तो यह मौजूद प्रत्येक पंक्ति के लिए डेटा लौटाएगा, जो कि आप नहीं चाहते हैं। इसलिए इसके बजाय उपरोक्त क्वेरी का उपयोग करें।


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