PostgreSQL 기초강의, PostgreSQL 기초강좌
73강 SQL 초석 다지기 : PostgreSQL CASE expression
SQL 초석 다지기 73강 시작합니다.
이번 시간에는
▶ PostgreSQL CASE expression
에 대해서 알아보는 시간입니다.
이번 강의부터 조건식과 cast 연산자를 다루게 되었습니다.
이번 시간에는 PostgreSQL CASE 조건식을 사용하여 조건부 쿼리를 구성하는 방법에 대해 알아봅니다.
PostgreSQL CASE 표현식은 다른 프로그래밍 언어의 IF/ELSE 문과 동일합니다. 이를 통해 쿼리에 if-else 논리를 추가하여 강력한 쿼리를 구성할 수 있습니다.
CASE는 표현식이므로 표현식을 사용할 수 있는 모든 장소에서 사용할 수 있습니다. SELECT, WHERE, Group BY 및 HAVING 절을 선택합니다.
CASE 표현식에는 일반적인 형식과 단순한 형식의 두 가지 형식이 있습니다.
1) General PostgreSQL CASE expression
다음은 CASE 문의 일반적인 형식을 보여줍니다:
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
[WHEN ...]
[ELSE else_result]
END
이 구문에서 각 조건(condition_1, condition_2…)은 true 또는 false를 반환하는 부울식입니다.
조건이 false로 평가되면 CASE 표현식은 true로 평가되는 조건을 찾을 때까지 다음 조건을 위에서 아래로 평가합니다.
조건이 true로 평가되면 CASE 식은 조건 뒤에 오는 해당 결과를 반환합니다. 예를 들어, 조건_2가 true로 평가되면 CASE 식은 result_2를 반환합니다. 또한 다음 식을 즉시 평가하지 않습니다.
모든 조건이 false로 평가되는 경우 CASE 식은 ELSE 키워드 뒤에 오는 결과(else_result)를 반환합니다. ELSE 절을 생략하면 CASE 식을 NULL로 반환합니다.
dvdrental 샘플 데이터베이스에서 필름 테이블을 살펴봅시다.
A) A general CASE example
일반적인 사례
다음 논리에 따라 필름에 길이별로 레이블을 지정한다고 가정합니다:
- 길이가 50분 미만이면 필름이 짧습니다.
- 길이가 50분을 초과하고 120분 이하인 경우 필름은 중간 크기이다.
- 길이가 120분 이상이면 필름이 길어집니다.
이 논리를 적용하려면 다음과 같이 SELECT 문에서 CASE 식을 사용할 수 있습니다:
SELECT title,
length,
CASE
WHEN length> 0
AND length <= 50 THEN 'Short'
WHEN length > 50
AND length <= 120 THEN 'Medium'
WHEN length> 120 THEN 'Long'
END duration
FROM film
ORDER BY title;
CASE 표현식 뒤에 열 별칭 duration을 지정했습니다.
B) Using CASE with an aggregate function example
집계 함수와 함께 사용하는 CASE 예제
다음 논리를 사용하여 영화에 가격 세그먼트를 할당한다고 가정합니다:
- 대여료가 0.99라면 영화는 경제적이다.
- 대여료가 1.99이면 필름은 질량입니다.
- 대여료가 4.99면 영화가 프리미엄이다.
그리고 경제성, 질량, 프리미엄에 속하는 영화의 수를 알고자 합니다.
이 경우 CASE 식을 사용하여 다음과 같이 조회를 구성할 수 있습니다:
SELECT
SUM (CASE
WHEN rental_rate = 0.99 THEN 1
ELSE 0
END
) AS "Economy",
SUM (
CASE
WHEN rental_rate = 2.99 THEN 1
ELSE 0
END
) AS "Mass",
SUM (
CASE
WHEN rental_rate = 4.99 THEN 1
ELSE 0
END
) AS "Premium"
FROM
film;
이 예제에서는 CASE 식을 사용하여 임대료가 각 가격 세그먼트에 포함될 경우 1 또는 0을 반환했습니다. 그리고 SUM 함수를 적용하여 가격 세그먼트별로 필름의 총합을 계산했습니다.
2) Simple PostgreSQL CASE expression
PostgreSQL은 다음과 같은 단순한 형식의 CASE 표현식을 제공합니다:
CASE expression
WHEN value_1 THEN result_1
WHEN value_2 THEN result_2
[WHEN ...]
ELSE
else_result
END
CASE는 먼저 식을 평가하고 일치하는 값을 찾을 때까지 WHEN 절의 각 값(value_1, value_2, …)과 순차적으로 비교합니다.
식의 결과가 WHEN 절의 값(값 1, 값 2 등)과 같으면 CASE는 THEN 절의 해당 결과를 반환합니다.
CASE가 일치하는 항목을 찾지 못하면 ELSE 뒤에 오는 else_result를 반환하고, ELSE를 사용할 수 없는 경우 NULL 값을 반환합니다.
A) Simple PostgreSQL CASE expression example
다음 문장에서는 CASE 식을 사용하여 출력에 등급 설명을 추가합니다:
SELECT title,
rating,
CASE rating
WHEN 'G' THEN 'General Audiences'
WHEN 'PG' THEN 'Parental Guidance Suggested'
WHEN 'PG-13' THEN 'Parents Strongly Cautioned'
WHEN 'R' THEN 'Restricted'
WHEN 'NC-17' THEN 'Adults Only'
END rating_description
FROM film
ORDER BY title;
이 예에서는 간단한 CASE 식을 사용하여 필름 테이블의 등급을 G, PG, NC17, PG-13과 같은 일부 리터럴 값과 비교하고 해당 등급 설명을 반환했습니다.
B) Using simple PostgreSQL CASE expression with aggregate function example
다음 문장에서는 SUM 함수와 함께 CASE 식을 사용하여 각 등급의 필름 수를 계산합니다:
SELECT
SUM(CASE rating
WHEN 'G' THEN 1
ELSE 0
END) "General Audiences",
SUM(CASE rating
WHEN 'PG' THEN 1
ELSE 0
END) "Parental Guidance Suggested",
SUM(CASE rating
WHEN 'PG-13' THEN 1
ELSE 0
END) "Parents Strongly Cautioned",
SUM(CASE rating
WHEN 'R' THEN 1
ELSE 0
END) "Restricted",
SUM(CASE rating
WHEN 'NC-17' THEN 1
ELSE 0
END) "Adults Only"
FROM film;
이번 강의에서는 PostgreSQL CASE 식을 사용하여 복잡한 쿼리를 구성하는 방법에 대해 배웠습니다.
프로그램에 IF문이 많이 사용되듯이 SQL에서는 CASE문이 정말 많이 사용됩니다.
오라클에서는 DECODE를 많이 사용하지만 중첩되어 있으면 해석하기가 까다롭습니다.
오라클을 사용할 때도 DECODE보다는 CASE문을 더 많이 사용했습니다.
감사합니다.
본 강의는 PostgreSQL Tutorial을 참조합니다. https://www.postgresqltutorial.com/ |
Do it! SQL을 찾아 주셔서 감사합니다. 공감 ♥ , 댓글이 큰 힘이 됩니다. |
'IT > SQL 기초강좌 (PostgreSQL)' 카테고리의 다른 글
75강 SQL 초석 다지기 : PostgreSQL NULLIF function (79) | 2023.01.18 |
---|---|
74강 SQL 초석 다지기 : PostgreSQL COALESCE function (74) | 2023.01.17 |
72강 SQL 초석 다지기 : PostgreSQL NOT NULL constraint (71) | 2023.01.15 |
71강 SQL 초석 다지기 : PostgreSQL UNIQUE constraint (125) | 2023.01.14 |
70강 SQL 초석 다지기 : PostgreSQL CHECK constraint (126) | 2023.01.13 |
댓글