Just do IT
article thumbnail
Published 2022. 12. 20. 11:04
SQL - CASE WHEN Programing/DB

CASE WHEN

컬럼 값에 따라 출력을 달리 하고 싶을 때 쿼리에서 사용할 수 있는 문법이다.

USE_YN
(사용여부)
Y
N

위와 같이 사용여부 컬럼에 사용, 미사용 이란 표현 대신 Y, N으로 입력해 놓고 출력할 때는
사용, 미사용으로 출력을 하고 싶을 경우 CASE WHEN을 사용하여 출력하는 것이다.

CASE WHEN 사용방법

IF문 방식 - 컬럼 값 비교

CASE WHEN
    USE_YN = 'Y' THEN '사용'
    USE_YN = 'N' THEN '미사용'
    ELSE '미정'
END AS USEAGE

1. CASE WHEN ~ END AS 컬럼명 
   - CASE WHEN : CASE WHEN의 시작
   - END AS 컬럼명 : 컬럼명은 임시 컬럼이기 때문에 테이블에 없는 컬럼명이여도 사용 가능하다.
2. 컬럼명 = 컬럼값 THEN 출력값
   - 컬럼명에 들어간 값을 비교하여서 참일 경우 출력될 값을 THEN 뒤에 작성해주면 된다.
   - 값의 비교는 비교 연산자를 사용하면 된다.
3. ELSE는 모든 값의 비교가 거짓일 때 출력될 값을 작성해주면 된다.
    (자바 IF문의 ELSE와 같은 기능이라고 생각하면 된다)
   - ELSE는 생략 가능하며, 생략 시 NULL이 기본값이 된다.

SWITCH문 방식 - 값의 크기 비교는 없음

CASE WHEN USE_YN
    'Y' THEN '사용'
    'N' THEN '미사용'
    ELSE '미정'
END AS USEAGE

1. CASE WHEN ~ END AS 컬럼명
   - CASE WHEN : CASE WHEN의 시작이며 값을 비교할 컬럼을 입력해준다 
   - END AS 컬럼명 : IF문 방식과 동일하다.
2. 컬럼명 = 컬럼값 THEN 출력값
   - 컬럼명에 들어간 값이 참일 경우 출력될 값을 THEN 뒤에 작성해주면 된다.
   - SWITCH 방식은 IF문 방식과 달리 값이 동일여부만 확인이 가능하다.
3. ELSE는 모든 값의 비교가 거짓일 때 출력될 값을 작성해주면 된다.
   (자바 IF문의 ELSE와 같은 기능이라고 생각하면 된다)
   - IF문 방식의 ELSE와 동일하다.


CASE WHEN 문법 팁!

입금관리테이블
ID 입금 입금분류코드
(1 : 카드입금, 2 : 현금입금)
A 300 1
A 400 2
B 300 1
B 500 2
출력 테이블
ID 카드입금 현금입금
A 300 400
B 300 500

위와 같이 입금 관련 테이블의 데이터를 출력테이블에 보이는 것처럼 데이터를 출력하고 싶다면 
CASE WHEN을 활용하면 된다. 

// 1번 쿼리

SELECT
    ID
    , CASE WHEN 입금분류코드 = '1' THEN SUM(입금) END AS 카드입금
    , CASE WHEN 입금분류코드 = '2' THEN SUM(입금) END AS 현금입금
FROM 입금분류테이블
    GROUP BY ID, 입금분류코드

** SUM(입금)을 해주는 이유는 동일한 분류코드일경우 모두 합하여 출력되게 하기 위함이다.
   (SUM 안하면 오류가 날 수 있다. 그렇기 때문에 꼭 SUM을 해주고 GROUP BY로 묶어 주어야 원하는 컬럼 끼리만 
    계산이 된다.)
위와 같이 작성해주면 데이터가 출력되지만 애매하게 출력이 되는 것을 볼 수 있을 것이다. (아래 테이블 참조)

1번 쿼리 출력 결과
ID 카드입금 현금입금
A NULL 400
B NULL 500
A 300 NULL
B 300 NULL

GROUP BY를 했음에도 값이 이상하게 출력이 된다.
하지만! 위의 쿼리로 출력을 하면 이렇게 출력되는게 제대로 출력이 되는 것이다.
NULL이 없는 출력 테이블과 같이 출력하고 싶다면 쿼리문을 한번 더 GROUP BY를 해주어야 한다.

// 2번 쿼리

SELECT ID, SUM(카드입금) AS 카드입금, SUM(현금입금) AS 현금입금
FROM (
    SELECT
        ID
        , CASE WHEN 입금분류코드 = '1' THEN SUM(입금) END AS 카드입금
        , CASE WHEN 입금분류코드 = '2' THEN SUM(입금) END AS 현금입금
    FROM 입금분류테이블
        GROUP BY ID, 입금분류코드
    )
GROUP BY ID
ORDER BY ID

위와 같이 쿼리를 한번 더 감싼 후 GROUP BY를 해주면 비로소
우리가 원하는 출력테이블과 같이 값이 출력되게 된다.

※ 참고

쿼리에서 SUM(컬럼명)을 해줄 때 컬럼명을 COALESCE를 사용을 추천한다.
SUM(COALESCE(컬럼명, 0))
COALESCE는 컬럼의 값이 널일 경우 지정한 값으로 출력해주기 때문에
SUM을 할 때 값이 오류가 나지 않는다.
(1 + NULL = NULL // 1 + 0 = 0)

'Programing > DB' 카테고리의 다른 글

Mybatis 문법  (0) 2022.12.05
SQL 문법을 알아보자  (0) 2022.12.02
DBeaver auto-commit 설정 해제하기  (0) 2022.12.02
다중 테이블에서 데이터를 한번 출력하는 방법  (0) 2022.11.30
쿼리 - null 체크하기  (0) 2022.11.30
profile

Just do IT

@AmyG

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!