La requête suggérée pour lister les types ENUM est excellente. Mais, il énumère simplement les schema
et les typname
. Comment lister les valeurs ENUM réelles? Par exemple, dans la réponse liée ci-dessus, je voudrais le résultat suivant
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
postgresql
punk
la source
la source
string_agg(e.enumlabel, ', ') as enum_value
avec le appropriéGROUP BYs
. Merci beaucoup.Vous pouvez lister le type de données via
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
la source
select enum_range(enum_first(null::province),null::province);
la source
select unnest(enum_range(null, null::name_of_enum_type));
pour obtenir une valeur par ligne.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlJ'oublie toujours comment faire ça. Comme pour l'autre réponse et le commentaire, il s'agit ici d'une liste séparée par des virgules. J'aime les extraits de code copier-coller. Merci pour l'aide:
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;
la source
Ceci:
SELECT unnest(enum_range(NULL::myenum))
renvoie les types enum sous forme de lignes.la source
@dpb:
Si vous souhaitez créer une méthode d'accès facile permanente pour cela, vous pouvez toujours créer une vue
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;
Vous pouvez ensuite créer un déclencheur pour la commande d'insertion.
Ce qui précède le stockera dans la base de données à des fins de référence futures.
la source
Cela répertorie toutes les colonnes typées enum et leurs valeurs potentielles:
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;
la source
Ajouter une commande
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;
la source
Si vous avez le nom de la table et de la colonne (mais pas le nom du type), utilisez ceci:
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 vous utilisez
enum_range
sur une colonne (contrairement aux autres réponses qui l'ont utilisé sur un type), il renverra des données pour chaque ligne qui existe, ce qui n'est pas ce que vous voulez. Utilisez donc plutôt la requête ci-dessus.la source
pg_namespace
, cela entraîne des associations incorrectes si le même nom d'énumération est présent dans plus d'un schéma ...