Query SQL per ottenere tutti i valori che può avere un enum


Risposte:


266

Se vuoi un array:

SELECT enum_range(NULL::myenum)

Se si desidera un record separato per ciascun elemento nell'enum:

SELECT unnest(enum_range(NULL::myenum))  

Informazioni aggiuntive

Questa soluzione funziona come previsto anche se il tuo enum non è nello schema predefinito. Ad esempio, sostituire myenumcon myschema.myenum.

Sarà il tipo di dati dei record restituiti nella query precedente myenum. A seconda di ciò che stai facendo, potrebbe essere necessario eseguire il cast al testo. per esempio

SELECT unnest(enum_range(NULL::myenum))::text

Se si desidera specificare il nome della colonna, è possibile aggiungere AS my_col_name.


Ringraziamo Justin Ohms per aver sottolineato alcuni suggerimenti aggiuntivi, che ho inserito nella mia risposta.


1
Questa risposta è molto più concisa. Bel contributo!
Darin Peterson,

3
La chiamata più inutile restituirà record di tipo myenum con un nome di colonna di "myenum". Potresti anche voler lanciare l'enum in testo e specificare un nome di colonna aggiungendo qualcosa di simile. :: text AS my_column
Justin Ohms,


1
qual è il significato di NULL::?
Sung Cho,

1
@ChrisL grazie. sembra molto strano. perché non possiamo farlo SELECT enum_range(myenum)? Qual è il significato del casting null?
Sung Cho,

31

Provare:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'

1
Se hai lo stesso enum in più di uno schema, potrebbe essere necessario restringere un po '. In tal caso, vedere postgresql.org/docs/current/static/catalog-pg-type.html per i dettagli.
Kev,

1
Penso che devi aggiungere il prefisso "myenum" con un trattino basso. Controlla la mia risposta se hai bisogno di ottenere valori enum e il nome enum può essere usato in più di uno schema.
David Underhill il

Se l'ordine di enumerazione è importante, aggiungere ORDER BY e.enumsortorderalla query. I valori enumerati saranno probabilmente fuori servizio se nuovi valori sono stati inseriti nel tipo di enumerazione usando BEFOREo AFTER.
Clint Pachl,

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Ciò restituirà un set di risultati a colonna singola del contenuto dell'enum "your_enum" con una colonna denominata "your_column" di tipo testo.


4

È possibile ottenere tutti i valori di enum per un enum usando la seguente query. La query ti consente di scegliere in quale spazio dei nomi risiede anche l'enum (che è necessario se l'enum è definito in più spazi dei nomi, altrimenti puoi omettere quella parte della query).

SELECT enumlabel
FROM pg_enum
WHERE enumtypid=(SELECT typelem
                 FROM pg_type
                 WHERE typname='_myenum' AND
                 typnamespace=(SELECT oid
                               FROM pg_namespace
                               WHERE nspname='myschema'))

1
Cosa vuoi dire che è il tipo di array? Questo funziona per me (PostgreSQL 9.0).
David Underhill,

+1 Questo ha funzionato per me, mentre la risposta di @ Kev no, a causa dell'uso di schemi nel mio DB.
user9645
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.