CASE
CASE는 특정 조건을 만날 때 SQL CODE를 실행시키기 위해 사용한다. 다른 프로그래밍 언어의 IF/ELSE와 비슷하다.
Searched Case Expression
CASE
WHEN condition1 THEN result1
WHEN conditoin2 THEN result2
ELSE some_other_result
END
SELECT a, ---------------------
CASE WHEN a = 1 THEN 'one' | a | label |
WHEN a = 2 THEN 'two' |---------------------|
ELSE 'other' AS label | 1 | one |
END | 2 | two |
FROM test; ---------------------
다양한 조건을 사용할 수 있다.
Simple Case Expression
SELECT expression
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE some_other_result
END
SELECT a,
CASE a WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM test;
동등(=) 비교일 경우에만 사용 가능하다.
CASE 예시
SELECT customer_id,
CASE
WHEN (customer_id < 100) THEN 'Preminum'
WHEN (customer_id BETWEEN 101 and 200) THEN 'Plus'
ELSE 'Normal'
END AS customer_class
FROM customers;
SELECT customer_id,
CASE customer_id
WHEN 2 THEN 'Winner'
WHEN 3 THEN 'Second Place'
ELSE 'Normal'
END AS customer_class
FROM customer;
SELECT
SUM(CASE rental_rate WHEN 0.99 THEN 1 ELSE 0 END) AS number_of_bargains,
SUM(CASE rental_rate WHEN 2.99 THEN 1 ELSE 0 END) AS regular,
SUM(CASE rental_rate WHEN 4.99 THEN 1 ELSE 0 END) AS preminum
FROM film; -- 각 개수를 구하는 데에도 CASE를 사용할 수 있다.
COALESCE
COALESCE 함수는 NULL이 아닌 첫 번째 인수를 반환한다.
- COALESCE 함수는 인수에 제한이 없다.
- 모든 인수가 NULL이면 COALESCE 함수도 NULL을 반환한다.
COALESCE 예시
SELECT item, (price COALESCE(discount, 0)) AS final FROM sales;
-- CASE 구문으로 표현 가능
SELECT item, (price -
CASE WHEN discount IS NOT NULL THEN discount
ELSE 0
END) AS sales
FROM sales;
CAST
CAST는 다른 타입으로 변환하기 위해 사용한다.
- CAST 구문:
- SELECT CAST('5' AS INTEGER)
- PostgreSQL CAST 연산자
- SELECT '5'::INTEGER
예시
-- inventory_id -> integer
SELECT CHAR_LENGTH(CAST(inventory_id AS VARCHAR)) FROM rental;
-- ERROR: function char_length(integer) does not exist
SELECT CHAR_LENGTH(inventory_id) FROM rental;
CHAR_LENGTH 함수에는 varchar를 넘겨줘야 하기 때문에 그냥 inventory_id 값을 넘겨주게 되면 에러가 발생한다.
NULLIF
NULLIF 함수는 2개의 인자를 받고 두 인자가 같은 값이면 NULL을 반환하고, 다르면 첫 번째 인자를 반환한다.
- NULLIF(10, 10) --> NULL
- NULLIF(10, 12) --> 10
NULLIF 예시
NAME | DEPARTMENT |
Lauren | A |
Vinton | A |
Claire | B |
-- 2가 나온다.
SELECT (
SUM(CASE WHEN department = 'A' THEN 1 ELSE 0 END) /
SUM(CASE WHEN department = 'B' THEN 1 ELSE 0 END)
) AS department_ratio
FROM depts;
DELET FROM depts
WHERE department = 'B'
-- ERROR: division by zero
SELECT (
SUM(CASE WHEN department = 'A' THEN 1 ELSE 0 END) /
SUM(CASE WHEN department = 'B' THEN 1 ELSE 0 END)
) AS department_ratio
FROM depts;
-- 해결방법 중 하나 --> NULL 값이 있는 산술 연산은 무조건 결과값이 NULL이다
SELECT (
SUM(CASE WHEN department = 'A' THEN 1 ELSE 0 END) /
NULLIF(SUM(CASE WHEN department = 'B' THEN 1 ELSE 0 END), 0)
) AS department_ratio
FROM depts;
'DB > DB 문법' 카테고리의 다른 글
TCL(Transaction Control Language) (0) | 2023.05.19 |
---|---|
쿼리 실행 순서 (1) | 2023.05.18 |
쿼리 조회 시 *(asterisk)는 정말 지양해야 할까? (0) | 2023.05.18 |
데이터베이스 및 테이블 생성 (0) | 2023.05.18 |
JOINS와 집합 연산자 (0) | 2023.05.16 |