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


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.


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'

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.


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'))

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.