web-dev-qa-db-ja.com

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

Postgresqlは少し前にenumサポートを取得しました。

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

クエリで列挙型で指定されたすべての値を取得するにはどうすればよいですか?

123
Wienczny

配列が必要な場合:

SELECT enum_range(NULL::myenum)

列挙型の各アイテムに個別のレコードが必要な場合:

SELECT unnest(enum_range(NULL::myenum))  

追加情報

このソリューションは、enumがデフォルトのスキーマにない場合でも期待どおりに機能します。たとえば、myenummyschema.myenumに置き換えます。

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

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

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


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

223
Chris L

試してください:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
28
Kev
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

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

5
Justin Ohms

次のクエリを使用して、列挙型のすべての列挙値を取得できます。クエリを使用すると、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'))
4
David Underhill