Consulta SQL para obtener todos los valores que puede tener una enumeración

Respuestas:

264

Si quieres una matriz:

SELECT enum_range(NULL::myenum)

Si desea un registro separado para cada elemento de la enumeración:

SELECT unnest(enum_range(NULL::myenum))  

Información Adicional

Esta solución funciona como se esperaba, incluso si su enumeración no está en el esquema predeterminado. Por ejemplo, reemplace myenumcon myschema.myenum.

El tipo de datos de los registros devueltos en la consulta anterior será myenum. Dependiendo de lo que esté haciendo, es posible que deba enviarlo al texto. p.ej

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

Si desea especificar el nombre de la columna, puede agregarlo AS my_col_name.


Gracias a Justin Ohms por señalar algunos consejos adicionales, que incorporé a mi respuesta.

Chris L
fuente
1
Esta respuesta es mucho más concisa. Buena contribución!
Darin Peterson
3
La llamada anulada devolverá registros de tipo myenum con un nombre de columna de "myenum". También es posible que desee convertir la enumeración en texto y especificar un nombre de columna agregando algo como. :: text AS my_column
Justin Ohms
1
Para entender más sobre las funciones de enumeración, puede ver este enlace postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
¿cuál es el significado de NULL::?
Sung Cho
1
@ Chris Gracias. Parece muy extraño. ¿Por qué no podemos hacer SELECT enum_range(myenum)? ¿Cuál es el significado de fundición null?
Sung Cho
31

Tratar:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
fuente
1
Si tiene la misma enumeración en más de un esquema, es posible que esto deba reducirse un poco. Si ese es el caso, vea postgresql.org/docs/current/static/catalog-pg-type.html para más detalles.
Kev el
1
Creo que necesitas prefijar 'myenum' con un guión bajo. Vea mi respuesta si necesita obtener valores de enumeración y el nombre de enumeración puede usarse en más de un esquema.
David Underhill
Si el orden de enumeración es importante, agregue ORDER BY e.enumsortordera la consulta. Los valores enumerados probablemente estarán fuera de orden si se insertaron nuevos valores en el tipo de enumeración usando BEFOREo AFTER.
Clint Pachl
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Esto devolverá un conjunto de resultados de una sola columna del contenido de la enumeración "your_enum" con una columna llamada "your_column" de tipo texto.

Justin Ohms
fuente
4

Puede obtener todos los valores de enumeración para una enumeración utilizando la siguiente consulta. La consulta también le permite elegir en qué espacio de nombres vive la enumeración (lo cual es necesario si la enumeración se define en múltiples espacios de nombres; de lo contrario, puede omitir esa parte de la 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
fuente
1
¿Qué quieres decir con que es el tipo de matriz? Esto funciona para mí (PostgreSQL 9.0).
David Underhill
+1 Esto funcionó para mí, mientras que la respuesta de @ Kev no, debido al uso de esquemas en mi base de datos.
user9645