enumerar el tipo ENUM de Postgres


100

La consulta sugerida para enumerar los tipos ENUM es excelente. Pero, simplemente enumera el schemay el typname. ¿Cómo enumero los valores ENUM reales? Por ejemplo, en la respuesta vinculada anterior, me gustaría el siguiente resultado

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

Respuestas:


134
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

4
dulce ... incluso mejor para usar string_agg(e.enumlabel, ', ') as enum_valuecon el apropiado GROUP BYs. Muchas gracias.
punkish

4
Esto es ridículo. ¿Por qué diablos no hay taquigrafía? (¡Gracias por la solución!)
dpb


71
select enum_range(enum_first(null::province),null::province);

11
Funcionó como un encanto, para otros, 'provincia' es el nombre del tipo de enumeración :)
Rana Deep

14
Use select unnest(enum_range(null, null::name_of_enum_type));para obtener un valor por fila.
Brian H

16
¡Gracias! De acuerdo con los documentos, no es necesario que lo repita dos veces si desea todo el rango select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton

15

Siempre olvido cómo hacer esto. Según la otra respuesta y el comentario, aquí hay una lista separada por comas. Me gustan los fragmentos de copiar y pegar. Gracias por la ayuda:

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;


0

@dpb:

Si desea crear un método de fácil acceso permanente para esto, siempre puede crear una vista

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;

A continuación, puede crear un disparador para el comando de inserción.

Lo anterior almacenará esto en la base de datos para futuras referencias.


0

Esto enumera todas las columnas con tipo de enumeración y sus valores potenciales:

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;

0

Agregar orden

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;

-2

Si tiene el nombre de la tabla y la columna, (pero no el nombre del tipo) use esto:

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

Si lo usa enum_rangeen una columna (en contraste con las otras respuestas que lo usaron en un tipo), devolverá datos para cada fila que exista, que no es lo que desea. Así que usa la consulta anterior en su lugar.


1
Como no se une pg_namespace, esto da como resultado asociaciones incorrectas si el mismo nombre de enumeración está presente en más de un esquema ...
blubb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.