Requête SQL pour obtenir toutes les valeurs qu'une énumération peut avoir

140

Postgresql a obtenu le support enum il y a quelque temps.

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

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

Wienczny
la source
J'ai également trouvé la réponse suivante très utile: stackoverflow.com/questions/9540681/list-postgres-enum-type
anonyme lâche

Réponses:

266

Si vous voulez un tableau:

SELECT enum_range(NULL::myenum)

Si vous voulez un enregistrement séparé 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 n'est pas dans le schéma par défaut. Par exemple, remplacez myenumpar 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.


Merci à Justin Ohms pour avoir signalé quelques conseils supplémentaires, que j'ai incorporés dans ma réponse.

Chris L
la source
1
Cette réponse est beaucoup plus concise. Belle contribution!
Darin Peterson
3
L'appel unnest renverra des enregistrements de type myenum avec un nom de colonne "myenum". Vous pouvez également convertir l'énumération en texte et spécifier un nom de colonne en ajoutant quelque chose comme. :: text AS my_column
Justin Ohms
1
Pour en savoir plus sur les fonctions d'énumération, vous pouvez consulter ce lien postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
quel est le sens de NULL::?
Chanté le
1
@ChrisL merci. cela semble très étrange. pourquoi ne pouvons-nous pas faire SELECT enum_range(myenum)? Quelle est la signification du casting null?
Sung Cho le
31

Essayer:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
la source
1
Si vous avez la même énumération dans plusieurs schémas, cela devra peut-être être réduit un peu. Si tel est le cas, consultez postgresql.org/docs/current/static/catalog-pg-type.html pour plus de détails.
Kev
1
Je pense que vous devez préfixer «myenum» avec un trait de soulignement. Consultez ma réponse si vous avez besoin d'obtenir des valeurs d'énumération et que le nom d'énumération peut être utilisé dans plusieurs schémas.
David Underhill
Si l'ordre d'énumération est important, ajoutez-le ORDER BY e.enumsortorderà la requête. Les valeurs énumérées seront probablement dans le désordre si de nouvelles valeurs ont été insérées dans le type d'énumération à l'aide de BEFOREou AFTER.
Clint Pachl
5
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 texte.

Justin Ohms
la source
4

Vous pouvez obtenir toutes les valeurs d'énumération pour une énumération à l'aide de la requête suivante. La requête vous permet de choisir dans quel espace de noms l'énumération réside également (ce qui est obligatoire si l'énumération est définie dans plusieurs espaces de noms; 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'))
David Underhill
la source
1
Que voulez-vous dire par le type de tableau? Cela fonctionne pour moi (PostgreSQL 9.0).
David Underhill
+1 Cela a fonctionné pour moi alors que la réponse de @ Kev n'a pas fonctionné, en raison de l'utilisation de schémas dans ma base de données.
user9645