Некоторое время назад Postgresql получил поддержку enum.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Как получить все значения, указанные в перечислении, с помощью запроса?
Некоторое время назад Postgresql получил поддержку enum.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Как получить все значения, указанные в перечислении, с помощью запроса?
Ответы:
Если вам нужен массив:
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'))