web-dev-qa-db-fra.com

Requête SQL pour obtenir toutes les valeurs qu'une enum peut avoir

Postgresql a reçu un soutien considérable il y a quelque temps.

CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);

Comment obtenir toutes les valeurs spécifiées dans l'énum avec une requête?

123
Wienczny

Si vous voulez un tableau:

SELECT enum_range(NULL::myenum)

Si vous souhaitez un enregistrement distinct pour chaque élément de l'énumération:

SELECT unnest(enum_range(NULL::myenum))  

Information additionnelle

Cette solution fonctionne comme prévu même si votre énumération ne se trouve pas dans le schéma par défaut. Par exemple, remplacez myenum par myschema.myenum.

Le type de données des enregistrements renvoyés dans la requête ci-dessus sera myenum. Selon ce que vous faites, vous devrez peut-être convertir en texte. par exemple.

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

Si vous souhaitez spécifier le nom de la colonne, vous pouvez ajouter AS my_col_name.


Nous remercions Justin Ohms d'avoir signalé quelques astuces supplémentaires, que j'ai intégrées à ma réponse.

223
Chris L

Essayer:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
28
Kev
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Cela renverra un ensemble de résultats de colonne unique du contenu de l'énumération "your_enum" avec une colonne nommée "your_column" de type text.

5
Justin Ohms

Vous pouvez obtenir toutes les valeurs enum pour une enum en utilisant la requête suivante. La requête vous permet également de choisir le nom de l'espace de nommage de l'énum (requis si l'enum est défini dans plusieurs espaces de nommage, sinon vous pouvez omettre cette partie de la requête).

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'))
4
David Underhill