2012-03-02 10 views
39

suggested query to list ENUM typesは素晴らしいです。しかし、それは単にschematypnameのリストです。実際のENUM値をどのようにリストアップするのですか?例えば、上記のリンクの答えに、私はいつもこれを行う方法を忘れて、次の結果list Postgres ENUMタイプ

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

答えて

67
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 
+2

甘い経由してデータ型を一覧表示することができます適切な 'GROUP BY 'で' string_agg(e.enumlabel、'、 ')をenum_value'として使用してください。どうもありがとう。 – punkish

+1

これはばかげている。なぜ地球上には省略形はありませんか? (回答ありがとう!) – dpb

+25

@dpb:psqlのコマンドラインクライアントで '\ dT +'を使用することができます –

8

をしたいと思います。他の答えやコメントによると、ここではコンマ区切りのリストです。コピー貼りのスニペットが好きです。助けてくれてありがとう。

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 
37
select enum_range(enum_first(null::province),null::province); 
+2

魅力のように働いていましたが、 'province'はenumタイプの名前です:) –

+0

男、あなたはクールです – Andrey

+5

行ごとに1つの値を取得するには、 'select unnest(enum_range(null、null :: name_of_enum_type));'を使用します。 –

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; 

ビューを作成することができます挿入コマンド。

上記は、将来の参考のためにこれをデータベースに保存します。種類にそれを使用して他の回答とは対照的に、あなたが列にenum_rangeを使用する場合は

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 

(:

-1

あなたは、テーブルやカラム名、(ただし、タイプ名)を持っている場合はこれを使用)、それはあなたが望むものではない存在する各行のデータを返します。代わりに上記のクエリを使用してください。

+0

'pg_namespace'に参加していないので、同じenum名が複数存在するスキーマ... – blubb

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;