Consulta SQL para obter todos os valores que uma enumeração pode ter

140

O Postgresql recebeu suporte enum há algum tempo.

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

Como obtenho todos os valores especificados na enumeração com uma consulta?

Wienczny
fonte
Eu também encontrei a seguinte resposta muito útil: stackoverflow.com/questions/9540681/list-postgres-enum-type
Covarde Anônimo

Respostas:

264

Se você deseja uma matriz:

SELECT enum_range(NULL::myenum)

Se você deseja um registro separado para cada item da enumeração:

SELECT unnest(enum_range(NULL::myenum))  

informação adicional

Essa solução funciona conforme o esperado, mesmo que sua enumeração não esteja no esquema padrão. Por exemplo, substitua myenumpor myschema.myenum.

O tipo de dados dos registros retornados na consulta acima será myenum. Dependendo do que você está fazendo, pode ser necessário converter em texto. por exemplo

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

Se você deseja especificar o nome da coluna, você pode anexar AS my_col_name.


Os meus agradecimentos a Justin Ohms por apontar algumas dicas adicionais, que incorporei à minha resposta.

Chris L
fonte
1
Essa resposta é muito mais concisa. Boa contribuição!
precisa
3
A chamada unnest retornará registros do tipo myenum com o nome da coluna "myenum". Você também pode converter o enum em texto e especificar um nome de coluna adicionando algo como. :: text AS my_column
Justin Ohms
1
Para entender mais sobre funções de enumeração que possa ver este link postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
qual é o significado de NULL::?
Sung Cho
1
@ChrisL thanks. parece muito estranho. por que não podemos fazer SELECT enum_range(myenum)? Qual é o significado do casting null?
Sung Cho
31

Experimentar:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
fonte
1
Se você tiver o mesmo enum em mais de um esquema, talvez seja necessário restringir um pouco. Se for esse o caso, consulte postgresql.org/docs/current/static/catalog-pg-type.html para obter detalhes.
Kev
1
Eu acho que você precisa prefixar 'myenum' com um sublinhado. Confira minha resposta se você precisar obter valores de enumeração e o nome da enumeração pode ser usado em mais de um esquema.
precisa saber é o seguinte
Se a ordem de enumeração for importante, acrescente ORDER BY e.enumsortorderà consulta. Os valores enumerados provavelmente ficarão fora de ordem se novos valores forem inseridos no tipo de enumeração usando BEFOREor AFTER.
Clint Pachl
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Isso retornará um conjunto de resultados de coluna única do conteúdo da enumeração "your_enum" com uma coluna denominada "your_column" do tipo text.

Justin Ohms
fonte
4

Você pode obter todos os valores de enum usando uma consulta a seguir. A consulta permite escolher em qual namespace o enum também está (o que é necessário se o enum estiver definido em vários namespaces; caso contrário, você poderá omitir essa parte da consulta).

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'))
David Underhill
fonte
1
Como assim, é o tipo de matriz? Isso funciona para mim (PostgreSQL 9.0).
quer
+1 Isso funcionou para mim, enquanto a resposta de @ Kev não funcionou, devido ao uso de esquemas no meu banco de dados.
user9645