La consulta sugerida para enumerar los tipos ENUM es excelente. Pero, simplemente enumera el schema
y 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'
postgresql
punk
fuente
fuente
string_agg(e.enumlabel, ', ') as enum_value
con el apropiadoGROUP BYs
. Muchas gracias.Puede enumerar el tipo de datos a través de
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
fuente
select enum_range(enum_first(null::province),null::province);
fuente
select unnest(enum_range(null, null::name_of_enum_type));
para obtener un valor por fila.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlSiempre 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;
fuente
Esto:
SELECT unnest(enum_range(NULL::myenum))
devuelve tipos de enumeración como filas.fuente
@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.
fuente
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;
fuente
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;
fuente
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_range
en 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.fuente
pg_namespace
, esto da como resultado asociaciones incorrectas si el mismo nombre de enumeración está presente en más de un esquema ...