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'
punk
fuente

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
un caballo sin nombre
fuente
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);
mxc
fuente
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;
Miguel
fuente
3

Esto: SELECT unnest(enum_range(NULL::myenum))devuelve tipos de enumeración como filas.

Brokolicový Džuß
fuente
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.

3 pieza
fuente
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;
lloriquear
fuente
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;
iugo
fuente
-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.

Ariel
fuente
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