2012-03-02 18 views
39

Il suggested query to list ENUM types è ottimo. Ma si limita ad elencare lo schema e lo typname. Come faccio a elencare i valori effettivi di ENUM? Per esempio, nella risposta linkato sopra, vorrei il seguente risultatolista Postgres ENUM tipo

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

risposta

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

dolce ... ancora meglio usa 'string_agg (e.enumlabel, ',') come enum_value' con l'appropriato' GROUP BYs'. Grazie molto. – punkish

+1

Questo è ridicolo. Perché mai non esiste una stenografia? (Grazie per la soluzione!) – dpb

+25

@dpb: Puoi usare '\ dT +' nel client della riga di comando psql –

8

mi dimentico sempre come fare questo. Come per l'altra risposta e il commento, qui è come lista separata da virgole. Mi piacciono i frammenti di copia e incolla. Grazie per l'aiuto.

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

Ha funzionato come un incantesimo, per altri, 'provincia' è il nome del tipo enum :) –

+0

man, sei fantastico – Andrey

+5

Usa 'select unnest (enum_range (null, null :: name_of_enum_type));' per ottenere un valore per riga. –

0

@dpb:

Se si desidera creare un metodo di accesso semplice permanente per questo, si può sempre creare 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; 

È quindi possibile creare un trigger per il comando di inserimento.

Quanto sopra lo memorizzerà nel database per scopi di riferimento futuri.

-1

Se avete il nome della tabella e di colonna, (ma non il nome del tipo) utilizzare questo:

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 

Se si utilizza enum_range su una colonna (in contrasto con le altre risposte che hanno usato su un tipo di) restituirà i dati per ogni riga esistente, che non è ciò che desideri. Quindi utilizzare la query precedente invece.

+0

Dato che non si uniscono a 'pg_namespace', ciò si traduce in associazioni errate se lo stesso nome enum è presente in più di un schema... – blubb

0

Questo elenca tutte le colonne enum-digitato ei loro valori possibili:

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;