列挙型が持つことができるすべての値を取得するSQLクエリ


回答:


264

配列が必要な場合:

SELECT enum_range(NULL::myenum)

列挙型の項目ごとに個別のレコードが必要な場合:

SELECT unnest(enum_range(NULL::myenum))  

追加情報

列挙型がデフォルトのスキーマにない場合でも、このソリューションは期待どおりに機能します。例えば、交換してくださいmyenummyschema.myenum

上記のクエリで返されるレコードのデータ型はになりますmyenum。実行している内容によっては、テキストにキャストする必要がある場合があります。例えば

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

列名を指定する場合は、を追加できますAS my_col_name


いくつかの追加のヒントを指摘してくれたJustin Ohmsに感謝します。


1
この答えははるかに簡潔です。いい貢献!
Darin Peterson

3
unnest呼び出しは、「myenum」という列名を持つタイプmyenumのレコードを返します。列挙型をテキストにキャストし、次のようなものを追加して列名を指定することもできます。:: text AS my_column
ジャスティンオーム

1
列挙型の関数についての詳細を理解するには、このリンクを表示することができますpostgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet

1
の意味はNULL::何ですか?
Sung Cho

1
@ChrisLありがとう。とても奇妙に思えます。なんでできないのSELECT enum_range(myenum)?キャストの意味は何nullですか?
Sung Cho、

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
「myenum」の前にアンダースコアを付ける必要があると思います。列挙値を取得する必要があり、列挙名が複数のスキーマで使用されている可能性がある場合は、私の回答を確認してください。
David Underhill、2011年

列挙の順序が重要な場合はORDER BY e.enumsortorder、クエリに追加します。BEFOREまたはを使用して列挙型に新しい値が挿入された場合、列挙値はおそらく順序が乱れますAFTER
Clint Pachl

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

これにより、テキスト型の「your_column」という名前の列を持つ列挙型「your_enum」の内容の単一列の結果セットが返されます。


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)で動作します。
David Underhill

+1これは私にとってはうまくいきましたが、私のデータベースでスキーマを使用しているため、@ Kevの答えはうまくいきませんでした。
user9645 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.