본문 바로가기
DB/DB 문법

조건식(Conditional Expressons)

by oneny 2023. 5. 18.

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