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

149

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

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

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

Wienczny
источник
Я также нашел очень полезным следующий ответ: stackoverflow.com/questions/9540681/list-postgres-enum-type
анонимный трус

Ответы:

285

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

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.


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

Крис Л
источник
1
Этот ответ намного короче. Хороший вклад!
Darin Peterson
3
Вызов unnest вернет записи типа myenum с именем столбца «myenum». Вы также можете преобразовать перечисление в текст и указать имя столбца, добавив что-то вроде. :: text AS my_column
Джастин
1
Чтобы узнать больше о функциях перечисления, вы можете просмотреть эту ссылку postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Бикал Баснет
1
в чем смысл NULL::?
Сунг Чо
1
@ChrisL, спасибо. это кажется очень странным. почему мы не можем SELECT enum_range(myenum)? В чем смысл кастинга null?
Сунг Чо
31

Пытаться:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Кев
источник
1
Если у вас есть одно и то же перечисление в нескольких схемах, возможно, потребуется немного сузить его. В этом случае подробности см. На postgresql.org/docs/current/static/catalog-pg-type.html .
Кев,
1
Я думаю, вам нужно поставить перед «myenum» знак подчеркивания. Ознакомьтесь с моим ответом, если вам нужно получить значения перечисления, а имя перечисления может использоваться более чем в одной схеме.
Дэвид Андерхилл
Если порядок перечисления важен, добавьте ORDER BY e.enumsortorderк запросу. Перечисленные значения, скорее всего, будут не в порядке, если новые значения были вставлены в тип перечисления с помощью BEFOREили AFTER.
Клинт Пахл
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

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

Джастин Ом
источник
4

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

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
Что вы имеете в виду, что это тип массива? У меня это работает (PostgreSQL 9.0).
Дэвид Андерхилл
+1 Это сработало для меня, тогда как ответ @ Kev - нет из-за использования схем в моей БД.
user9645