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 |