A consulta sugerida para listar os tipos ENUM é excelente. Mas, ele apenas lista o schema
e 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'
postgresql
punk
fonte
fonte
string_agg(e.enumlabel, ', ') as enum_value
com o apropriadoGROUP BYs
. Muito Obrigado.Você pode listar o tipo de dados via
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
fonte
select enum_range(enum_first(null::province),null::province);
fonte
select unnest(enum_range(null, null::name_of_enum_type));
para obter um valor por linha.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlSempre 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;
fonte
Este:
SELECT unnest(enum_range(NULL::myenum))
retorna tipos de enum como linhas.fonte
@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.
fonte
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;
fonte
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;
fonte
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_range
em 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.fonte
pg_namespace
, isso resulta em associações erradas se o mesmo nome de enum estiver presente em mais de um esquema ...