SQL-запит, щоб отримати всі значення, які може мати enum


140

Postgresql деякий час тому отримав підтримку enum.

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

Як я можу отримати всі значення, вказані в enum із запитом?


Я також вважаю таку відповідь дуже корисною: stackoverflow.com/questions/9540681/list-postgres-enum-type
анонімний боягуз

Відповіді:


264

Якщо ви хочете масив:

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
Ця відповідь набагато стисліша. Приємний внесок!
Дарин Петерсон

3
Unnest виклик поверне записи типу мієн з назвою стовпця "myenum". Ви також можете передати перерахунок тексту та вказати ім'я стовпця, додавши щось подібне. :: текст AS my_column
Джастін

1
Щоб дізнатися більше про функції enum, перегляньте це посилання postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet

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
Я думаю, що вам потрібно зробити префікс "мієн" з підкресленням. Перевірте мою відповідь, якщо вам потрібно отримати значення enum, а ім'я enum може використовуватися у більш ніж одній схемі.
Девід Андерхілл

Якщо порядок перерахування важливий, додайте ORDER BY e.enumsortorderдо запиту. Перераховані значення, швидше за все, вийдуть з ладу, якщо нові значення були вставлені у тип перерахування з використанням BEFOREабо AFTER.
Клінт Пахл

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

Це поверне набір результатів єдиного стовпця вмісту enum "your_enum" зі стовпцем "your_column" тексту типу.


4

Ви можете отримати всі значення enum для enum, використовуючи наступний запит. Запит дозволяє вам вибрати, в якому просторі імен також переживається enum (що потрібно, якщо 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'))

1
Що ви маєте на увазі, що це тип масиву? Це працює для мене (PostgreSQL 9.0).
Девід Андерхілл

+1 Це працювало для мене, тоді як відповідь @ Кева не зробила через використання схем у моїй БД.
user9645
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.