list Postgres ENUM type

99

La requête suggérée pour lister les types ENUM est excellente. Mais, il énumère simplement les schemaet 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'
punk
la source

Réponses:

133
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 cheval sans nom
la source
4
doux ... encore mieux à utiliser string_agg(e.enumlabel, ', ') as enum_valueavec le approprié GROUP BYs. Merci beaucoup.
punkish
4
C'est ridicule. Pourquoi diable n'y a-t-il pas de sténographie? (Merci pour la solution!)
dpb
71
select enum_range(enum_first(null::province),null::province);
mxc
la source
11
A travaillé comme un charme, pour d'autres, «province» est le nom du type enum :)
Rana Deep
14
Utilisez select unnest(enum_range(null, null::name_of_enum_type));pour obtenir une valeur par ligne.
Brian H
16
Merci! Selon la documentation, vous n'avez pas besoin de le répéter deux fois si vous voulez toute la gamme select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton
15

J'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;
Michael
la source
3

Ceci: SELECT unnest(enum_range(NULL::myenum))renvoie les types enum sous forme de lignes.

Brokolicový Džuß
la source
0

@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.

3 pièces
la source
0

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;
blubb
la source
0

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;
iugo
la source
-2

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_rangesur 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.

Ariel
la source
1
Puisque vous ne rejoignez pas 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 ...
blubb