우리가 흔히 쓰는 프로그래밍 언어에서 사용하는 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 ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
name | current_mood
------+--------------
Moe | happy (1 row)
** 여기까지만 보면 기존의 문자열 타입과 다른점이 없어보인다.
그렇다면 그냥 데이터를 한정시켜 놓고 사용하기 용이함 때문에 굳이 구분해서 사용하는 걸까?
아니다.
아래를 살펴보자.
1. Ordering (순서)
The ordering of the values in an enum type is the order in which the values were listed when the type was created.
All standard comparison operators and related aggregate functions are supported for enums.
enum 타입에서 값 순서는 생성될때 만들어진다.
모든 표준 기본 연산자와 집계 함수는 enum 타입을 지원한다.
정리하면 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)
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
SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;
name | current_mood
-------+--------------
Curly | ok
Moe | happy
SELECT name
FROM person
WHERE current_mood = (SELECT MIN(current_mood) FROM person);
name
-------
Larry
2. Type Safety
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
------+-----------
Moe | 4
REFERENCES
PostgreSQL : Documentation: 13: PostgreSQL 13.7 Documentation
postgrespro.com
'DB > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] PostgreSQL의 Date/Time 타입에 대해서 알아보자. (0) | 2022.06.19 |
---|---|
[PostgreSQL] PostgreSQL의 통화 타입에 대해서 알아보자. (Monetary Types) (0) | 2022.06.17 |
[PostgreSQL] PostgreSQL의 boolean 타입에 대해서 알아보자. (0) | 2022.06.17 |
[PostgreSQL] PostgreSQL의 이진 타입에 대해서 알아보자. (Binary Type) (0) | 2022.06.14 |
[PostgreSQL] PostgreSQL의 문자 타입에 대해서 알아보자. (Character Types) (0) | 2022.06.14 |