Некоторое время назад Postgresql получил поддержку enum.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Как получить все значения, указанные в перечислении, с помощью запроса?
postgresql
enums
Wienczny
источник
источник
Ответы:
Если вам нужен массив:
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
Это вернет набор результатов с одним столбцом содержимого перечисления "your_enum" со столбцом с именем "your_column" типа text.
источник
Вы можете получить все значения перечисления для перечисления, используя следующий запрос. Запрос позволяет вам выбрать, в каком пространстве имен находится перечисление (что требуется, если перечисление определено в нескольких пространствах имен; в противном случае вы можете пропустить эту часть запроса).
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'))
источник