8.7. Ð¢Ð¸Ð¿Ñ Ð¿ÐµÑеÑиÑлений #
Ð¢Ð¸Ð¿Ñ Ð¿ÐµÑеÑиÑлений (enum) опÑеделÑÑÑ ÑÑаÑиÑеÑкий ÑпоÑÑдоÑеннÑй Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений, Ñак же как и ÑÐ¸Ð¿Ñ enum, ÑÑÑеÑÑвÑÑÑие в ÑÑде ÑзÑков пÑогÑаммиÑованиÑ. РкаÑеÑÑве пеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пÑивеÑÑи дни недели или Ð½Ð°Ð±Ð¾Ñ ÑоÑÑоÑний.
8.7.1. ÐбÑÑвление пеÑеÑиÑлений #
Тип пеÑеÑиÑлений ÑоздаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE, напÑÐ¸Ð¼ÐµÑ Ñак:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');СозданнÑе ÑÐ¸Ð¿Ñ enum можно иÑполÑзоваÑÑ Ð² опÑеделениÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ ÑÑнкÑий, как и лÑбÑе дÑÑгие:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
name | current_mood
------+--------------
Moe | happy
(1 row)8.7.2. ÐоÑÑдок #
ÐоÑÑдок знаÑений в пеÑеÑиÑлении опÑеделÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑÑ, в коÑоÑой бÑли ÑÐºÐ°Ð·Ð°Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ñи Ñоздании Ñипа. ÐеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð²Ñеми ÑÑандаÑÑнÑми опеÑаÑоÑами ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑвÑзаннÑми агÑегаÑнÑми ÑÑнкÑиÑми. ÐапÑимеÑ:
INSERT INTO person VALUES ('Larry', 'sad');
INSERT INTO person VALUES ('Curly', 'ok');
SELECT * FROM person WHERE current_mood > 'sad';
name | current_mood
-------+--------------
Moe | happy
Curly | ok
(2 rows)
SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;
name | current_mood
-------+--------------
Curly | ok
Moe | happy
(2 rows)
SELECT name
FROM person
WHERE current_mood = (SELECT MIN(current_mood) FROM person);
name
-------
Larry
(1 row)8.7.3. ÐезопаÑноÑÑÑ Ñипа #
ÐÑе ÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑлений ÑÑиÑаÑÑÑÑ ÑникалÑнÑми и поÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑазнÑÑ Ñипов нелÑÐ·Ñ ÑÑавниваÑÑ. ÐзглÑниÑе на ÑÑÐ¾Ñ Ð¿ÑимеÑ:
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');
ÐШÐÐÐÐ: невеÑное знаÑение Ð´Ð»Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ð¸Ñ happiness: "sad"
SELECT person.name, holidays.num_weeks FROM person, holidays
WHERE person.current_mood = holidays.happiness;
ÐШÐÐÐÐ: опеÑаÑÐ¾Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ: mood = happinessÐÑли вам дейÑÑвиÑелÑно нÑжно ÑделаÑÑ ÑÑо-Ñо подобное, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе либо ÑеализоваÑÑ ÑобÑÑвеннÑй опеÑаÑоÑ, либо Ñвно пÑеобÑазоваÑÑ ÑÐ¸Ð¿Ñ Ð² запÑоÑе:
SELECT person.name, holidays.num_weeks FROM person, holidays WHERE person.current_mood::text = holidays.happiness::text; name | num_weeks ------+----------- Moe | 4 (1 row)
8.7.4. ТонкоÑÑи ÑеализаÑии #
РмеÑкаÑ
знаÑений ÑегиÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñ. е. 'happy' и 'HAPPY' â не одно и Ñо же. Также в меÑкаÑ
имеÑÑ Ð·Ð½Ð°Ñение пÑобелÑ.
ХоÑÑ ÑипÑ-пеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑедназнаÑÐµÐ½Ñ Ð¿Ñежде вÑего Ð´Ð»Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ð½Ð°Ð±Ð¾Ñов знаÑений, имееÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð½Ð¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð² ÑÑÑеÑÑвÑÑÑий Ñип-пеÑеÑиÑление и пеÑеименовÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ (Ñм. ALTER TYPE). Ðднако ÑдалÑÑÑ ÑÑÑеÑÑвÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð¸Ð· пеÑеÑиÑлениÑ, а Ñакже изменÑÑÑ Ð¸Ñ Ð¿Ð¾ÑÑдок, нелÑÐ·Ñ â Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½Ñжного ÑезÑлÑÑаÑа пÑидÑÑÑÑ ÑдалиÑÑ Ð¸ воÑÑоздаÑÑ ÑÑо пеÑеÑиÑление.
ÐнаÑение enum Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° диÑке 4 байÑа. Ðлина ÑекÑÑовой меÑки знаÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑена паÑамеÑÑом компилÑÑии NAMEDATALEN; в ÑÑандаÑÑнÑÑ
ÑбоÑкаÑ
PostgreSQL он огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð´Ð»Ð¸Ð½Ñ 63 байÑами.
СопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð½ÑÑÑенниÑ
знаÑений enum Ñ ÑекÑÑовÑми меÑками Ñ
ÑанÑÑÑÑ Ð² ÑиÑÑемном каÑалоге pg_enum. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в ÑÑде ÑлÑÑаев.