リストPostgresENUMタイプ


105

リストのENUM型への提案クエリは素晴らしいです。しかし、それは単にの一覧schematypname。実際のENUM値を一覧表示するにはどうすればよいですか?たとえば、上記のリンクされた回答では、次の結果が必要です

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

回答:


139
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です。どうもありがとう。
パンクっぽい2012年

4
ばかげてる。一体なぜ速記がないのですか?(しかし、解決策をありがとう!)
dpb 2015年


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

11
チャームのように機能し、他の人にとっては、「州」は列挙型の名前です:)
Rana Deep

14
select unnest(enum_range(null, null::name_of_enum_type));行ごとに1つの値を取得するために使用します。
ブライアンH

16
ありがとう!ドキュメントによると、範囲全体が必要な場合は、2回繰り返す必要はありませんselect enum_range(null::my_enum)postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton

16

私はいつもこれを行う方法を忘れています。他の回答とコメントによると、ここではコンマ区切りのリストです。コピーアンドペーストのスニペットが好きです。助けてくれてありがとう:

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;


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、同じ列挙型名が複数のスキーマに存在する場合、誤った関連付けが発生します...
blubb 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.