2012-03-02 24 views
39

El suggested query to list ENUM types es excelente. Pero, simplemente enumera el schema y el typname. ¿Cómo hago una lista de los valores ENUM reales? Por ejemplo, en la respuesta vinculado anteriormente, me gustaría que el siguiente resultadolista Postgres ENUM tipo

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

Respuesta

67
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 
+2

dulce ... incluso mejor use 'string_agg (e.enumlabel, ',') como enum_value' con el apropiado' GROUP BYs'. Muchas gracias. – punkish

+1

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

+25

@dpb: Puede usar '\ dT +' en el cliente de línea de comando psql –

8

siempre se me olvida cómo hacer esto. Según la otra respuesta y el comentario, aquí está como 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 
37
select enum_range(enum_first(null::province),null::province); 
+2

Funcionó como un amuleto, para otros, 'provincia' es el nombre enum tipo :) –

+0

hombre, eres genial – Andrey

+5

Use 'select unnest (enum_range (null, null :: name_of_enum_type));' para obtener un valor por fila. –

0

@dpb:

Si desea crear un método de fácil acceso permanente para esto, siempre se 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, podría crear un disparador para el comando de inserción.

Lo anterior se almacenará en la base de datos para futuras consultas.

-1

Si usted tiene el nombre de la tabla y la columna, (pero no el nombre del tipo) utilizar este:

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 utiliza enum_range en una columna (en contraste con las otras respuestas, que lo utilizaron en un tipo) Devolverá datos para cada fila que exista, que no es lo que desea. Entonces usa la consulta anterior en su lugar.

+0

Dado que no se unen 'pg_namespace', esto da como resultado asociaciones incorrectas si el mismo nombre enum está presente en más de un esquema... – blubb

0

Esta lista todas las columnas ENUM -mecanografiado y sus valores posibles:

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;