listar o tipo ENUM do Postgres

105

A consulta sugerida para listar os tipos ENUM é excelente. Mas, ele apenas lista o schemae o typname. Como faço para listar os valores ENUM reais? Por exemplo, na resposta vinculada acima, eu gostaria do seguinte resultado

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

Respostas:

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
um cavalo sem nome
fonte
4
doce ... melhor ainda para usar string_agg(e.enumlabel, ', ') as enum_valuecom o apropriado GROUP BYs. Muito Obrigado.
punk de
4
Isto é ridículo. Por que diabos não há taquigrafia? (Obrigado pela solução!)
dpb
72
select enum_range(enum_first(null::province),null::province);
mxc
fonte
11
Funcionou como um encanto, para outros, 'província' é o nome do tipo enum :)
Rana Deep
14
Use select unnest(enum_range(null, null::name_of_enum_type));para obter um valor por linha.
Brian H
16
Obrigado! De acordo com os documentos, você não precisa repetir duas vezes se quiser toda a gama select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton
16

Sempre esqueço como fazer isso. De acordo com a outra resposta e o comentário, aqui está uma lista separada por vírgulas. Eu gosto de copiar e colar trechos. Obrigado pela ajuda:

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;
Michael
fonte
4

Este: SELECT unnest(enum_range(NULL::myenum))retorna tipos de enum como linhas.

Brokolicový Džuß
fonte
0

@dpb:

Se você deseja criar um método de acesso fácil permanente para isso, você sempre pode criar uma visualização

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;

Você pode então criar um gatilho para o comando de inserção.

O item acima irá armazenar isso no banco de dados para fins de referência futura.

3 peças
fonte
0

Isso lista todas as colunas digitadas em enum e seus valores potenciais:

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;
blubb
fonte
0

Adicionar pedido

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;
Iugo
fonte
-2

Se você tiver o nome da tabela e da coluna (mas não o nome do tipo), use:

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

Se você usar enum_rangeem uma coluna (em contraste com as outras respostas que usaram em um tipo), ele retornará dados para cada linha existente, o que não é o que você deseja. Portanto, use a consulta acima.

Ariel
fonte
1
Como você não participa pg_namespace, isso resulta em associações erradas se o mesmo nome de enum estiver presente em mais de um esquema ...
blubb