SQL-запрос для получения всех значений, которые может иметь перечисление

Postgresql получил поддержку enum некоторое время назад.

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

Как получить все значения, указанные в перечислении с запросом?

Ответ 1

Если вам нужен массив:

SELECT enum_range(NULL::myenum)

Если вам нужна отдельная запись для каждого элемента в перечислении:

SELECT unnest(enum_range(NULL::myenum))  

Дополнительная информация

Это решение работает так, как ожидалось, даже если ваше перечисление отсутствует в схеме по умолчанию. Например, замените myenum на myschema.myenum.

Тип данных возвращенных записей в вышеуказанном запросе будет myenum. В зависимости от того, что вы делаете, вам может потребоваться отбросить текст. например.

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

Если вы хотите указать имя столбца, вы можете добавить AS my_col_name.


Благодарим Джастина Омаса за указание некоторых дополнительных советов, которые я включил в свой ответ.

Ответ 2

Try:

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

Ответ 3

Вы можете получить все значения перечисления для перечисления, используя следующий запрос. Запрос позволяет выбрать, в каком пространстве имен также находится enum (что необходимо, если перечисление определено в нескольких пространствах имен, в противном случае вы можете опустить эту часть запроса).

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

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

Это вернет единичный результирующий набор содержимого перечисления "your_enum" с столбцом с именем "your_column" текста типа.