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'

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

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);

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;


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.


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;

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;

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.