2012-03-02 3 views
39

Le suggested query to list ENUM types est génial. Mais, il répertorie simplement les schema et les typname. Comment puis-je lister les valeurs ENUM réelles? Par exemple, dans la réponse ci-dessus liée, je voudrais le résultat suivantliste Postgres ENUM type

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

Répondre

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

doux ... encore mieux utilisez 'string_agg (e.enumlabel, ',') comme enum_value' avec les' GROUP BYs 'appropriés. Merci beaucoup. – punkish

+1

C'est ridicule. Pourquoi diable n'y a-t-il pas de raccourci? (Merci pour la solution!) – dpb

+25

@dpb: Vous pouvez utiliser '\ dT +' dans le client de ligne de commande psql –

8

J'oublie toujours comment faire cela. Comme pour l'autre réponse et le commentaire, ici c'est une liste séparée par des virgules. J'aime les extraits de 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 
37
select enum_range(enum_first(null::province),null::province); 
+2

Travaillé comme un charme, pour d'autres, 'province' est le nom de type enum :) –

+0

homme, vous êtes cool – Andrey

+5

Utilisez 'select unnest (enum_range (null, null :: name_of_enum_type));' pour obtenir une valeur par ligne. –

0

@dpb:

Si vous souhaitez créer une méthode facile d'accès permanent, 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 va stocker cela dans la base de données pour référence ultérieure.

-1

Si vous avez le nom de table et 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 retournera des données pour chaque ligne qui existe, ce qui n'est pas ce que vous voulez. Donc, utilisez la requête ci-dessus à la place.

+0

Puisque vous ne joignez pas 'pg_namespace', cela entraîne de mauvaises associations si le même nom d'enum est présent dans plus d'un schéma... – blubb

0

Liste toutes dactylographié ENUM colonnes 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;