DB/PostgreSQL

[PostgreSQL] PostgreSQL의 Enum 타입에 대해서 알아보자.

빙기때침식곡 2022. 6. 17. 01:06
반응형

우리가 흔히 쓰는 프로그래밍 언어에서 사용하는 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

 

반응형