Перечислимые типы (enum) представляют собой типы данных, состоящие из статического упорядоченного набора значений. Они эквивалентны типам enum
поддерживаемым во многих языках программирования. Примером перечислимого типа могут служить дни недели или набор статусных значений для элемента данных.
Типы enum создаются с помощью команды CREATE TYPE , например:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
После создания перечислимый тип можно использовать в определениях таблиц и функций точно так же, как и любой другой тип:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES ('Мо', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
name | current_mood
------+--------------
Мо | happy
(1 строка)
Порядок значений в перечисляемом типе данных (enum) соответствует порядку, в котором эти значения были перечислены при создании типа. Для перечислений поддерживаются все стандартные операторы сравнения и связанные агрегатные функции. Например:
INSERT INTO person VALUES ('Larry', 'sad');
INSERT INTO person VALUES ('фигурная скобка', 'ok');
SELECT * FROM person WHERE current_mood > 'sad';
name | current_mood
-------+--------------
Мо | happy
фигурная скобка | ok
(2 строки)
SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;
name | current_mood
-------+--------------
фигурная скобка | ok
Мо | happy
(2 строки)
SELECT name
FROM person
WHERE current_mood = (SELECT MIN(current_mood) FROM person);
name
-------
Larry
(1 строка)
Каждый перечисляемый тип данных является независимым и не может сравниваться с другими перечисляемыми типами. См. следующий пример:
CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
CREATE TABLE holidays (
num_weeks integer,
happiness happiness
);
INSERT INTO holidays(num_weeks,happiness) VALUES (4, 'happy');
INSERT INTO holidays(num_weeks,happiness) VALUES (6, 'very happy');
INSERT INTO holidays(num_weeks,happiness) VALUES (8, 'ecstatic');
INSERT INTO holidays(num_weeks,happiness) VALUES (2, 'sad');
ERROR: invalid input value for enum happiness: "sad"
SELECT person.name, holidays.num_weeks FROM person, holidays
WHERE person.current_mood = holidays.happiness;
ERROR: operator does not exist: mood = happiness
Если вам действительно необходимо выполнить подобную операцию, вы можете либо создать пользовательский оператор, либо добавить в запрос явное приведение типов:
SELECT person.name, holidays.num_weeks FROM person, holidays WHERE person.current_mood::text = holidays.happiness::text; name | num_weeks ------+----------- Мо | 4 (1 строка)
Метки перечислений чувствительны к регистру, поэтому
'happy' не совпадает с 'HAPPY'.
Пробелы в метках также являются значимыми.
Хотя типы-перечисления в первую очередь предназначены для статических наборов значений, поддерживается добавление новых значений в существующий тип-перечисление, а также переименование значений (см. ALTER TYPE). Из типа-перечисления нельзя удалить существующие значения, как и нельзя изменить порядок их сортировки без удаления и повторного создания самого типа.
Значение перечисления занимает на диске четыре байта. Длина текстовой метки значения перечисления ограничена параметром, NAMEDATALEN
заданным при компиляции Digital Q.DataBase; в стандартных сборках это значение составляет максимум 63 байта.
Соответствие внутренних значений перечисления текстовым меткам хранится в системном каталоге
pg_enum.
Прямое обращение к этому каталогу с запросами может быть полезным.