Postgresql деякий час тому отримав підтримку enum.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Як я можу отримати всі значення, вказані в enum із запитом?
Postgresql деякий час тому отримав підтримку enum.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Як я можу отримати всі значення, вказані в enum із запитом?
Відповіді:
Якщо ви хочете масив:
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
.
Подяку Джастіну Омсу за вказівку деяких додаткових порад, які я включив у свою відповідь.
NULL::
?
SELECT enum_range(myenum)
? У чому сенс кастингу null
?
Спробуйте:
SELECT e.enumlabel
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid
WHERE t.typname = 'myenum'
ORDER BY e.enumsortorder
до запиту. Перераховані значення, швидше за все, вийдуть з ладу, якщо нові значення були вставлені у тип перерахування з використанням BEFORE
або AFTER
.
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column
Це поверне набір результатів єдиного стовпця вмісту enum "your_enum" зі стовпцем "your_column" тексту типу.
Ви можете отримати всі значення 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'))