중요한 IF / CASE 문법
자주쓰는 IF 함수
쿼리를 다루다뷰면 문자나 숫자 같은 데이터 넣는 곳이 많습니다.
근데 그 곳에 한가지 고정이 아니라 조건에 따라 각각 값을 넣고 싶을때 if/case문을 사용합면 됩니다.
IF(조건식, 조건식맞으면이거, 조건식틀리면이거);
IF() 안에 차례로 이것들을 넣으면 됩니다.
조건식은 WHERE 뒤에 쓰던거 그대로 사용하시면 됩니다.
SELECT IF(1+2=3, '정답', '오답');
이렇게 쿼리를 날리면 어떻게 될까요?
조건식이 참이니 ‘정답’이라는 문자가 그 자리에 남습니다.
IF()는 문자, 숫자 등의 데이터가 들어가는 곳에 전부 넣을 수 있기 때문에 이렇게 사용할 수 있습니다.
예를들어 card 테이블에서
사용금액이 20만원이 넘는 경우 ‘부자’ 그게 아니면 ‘거지’ 이렇게 출력하고 싶습니다.
SELECT 고객명, 사용금액, IF(사용금액 > 200000, '부자', '거지')
FROM card;
일케 쿼리를 짜면 되구여
SELECT 뒤에 컬럼명이 아니라 숫자나 문자를 넣으면 그대로 출력해준다 했죠??
숫자나 문자 말고 IF()를 넣어본 것입니다.
진짜네염;;
하지만 IF 약점이 여기서 드러납니다.
그게머냐? 참과 거짓 밖에 나타낼 수 없다는 점입니다.(둘 중에 하나만 골라 yes or yes)
사용금액이 20만원 이상 이면 ‘부자’
사용금액이 10 ~ 20만원이면 ‘평타’
사용금액이 10만원 미만이면 ‘그지’
이렇게 세가지 경우를 만들고 싶을땐 어떡할까요?
물론 IF안에 또 IF를 써도 되지만
우리는 고등생물이기 때문에 CASE란 문법을 사용합니다.
CASE 문법
똑같이 문자나 숫자 같은 데이터 넣는 자리에 CASE 를 넣을 수 있습니다. CASE 문법 안에 조건식과 조건식이 맞으면 남길 값을 매우 많이 넣을 수 있슴다.
CASE
WHEN 조건식1 THEN 남길값1
WHEN 조건식2 THEN 남길값2
WHEN 조건식3 THEN 남길값3
END
case/end 사이에 많은 WHEN 조건식 THEN 남길 값을 여러개 넣을 수 있는데요
일반적으로 저희 코딩배울때 case문 있자나요?? 그거랑 똑같습니다.
- 조건식이 맞을 경우 2. 남길 값을 그자리에 남기고 3. case문 종료
이런 식입니다.
그럼 아까 문제를 다시 봅세다.
사용금액이 20만원 이상 이면 ‘부자’
사용금액이 10 ~ 20만원이면 ‘평타’
사용금액이 10만원 미만이면 ‘그지’
이렇게 세가지 경우를 만들고 싶을땐 어떡할까요?
SELECT 고객명, 사용금액,
CASE
WHEN 사용금액 >= 200000 THEN '부자'
WHEN 사용금액 >= 100000 AND 사용금액 < 200000 THEN '평타'
WHEN 사용금액 < 100000 THEN '그지'
END
FROM card;
잘 출력이 됩니당
님들아 심심하면 맨 끝에 ELSE도 추가해줄 수 있는데
CASE
WHEN 조건식1 THEN 남길값1
WHEN 조건식2 THEN 남길값2
WHEN 조건식3 THEN 남길값3
ELSE 남길값4
END
오결(오늘의 결론)
그래서 오늘의 결론은 어떤 조건식에 따라 값을 다르게 남기고 싶으면 IF()를 쓰면되는데, 경우가 3개 이상이면 CASE를 쓴당
실습
그럼 조건식들이 다 안맞으면 ELSE로 짬처리 하면서 값을 남겨줍니다.
Q1. card 테이블에서 장부를 조작하려고 합니다.
사용금액 30만원 이상은 50% 증액, 30만원 미만은 10% 증액해서 사용금액의 총 합계를 출력해봅시다. 답은 5147550로 나오면 정답입니다.
(예시) 사용금액이 40만원인 행은 60만원으로, 20만원인 행은 22만원으로 바꿔서 더해보라는 소리입니다.
SELECT
SUM(
IF (사용금액 >= 300000, 사용금액 * 1.5, 사용금액 * 1.1)
)
FROM card;
Q2. 고객등급을 재설정하려고 합니다.
사용금액이 30만원 이상은 'vip'
20만원 이상 30만원 미만은 '로열'
그 외엔 '패밀리'로 다시 설정하려고 합니다.
고객등급이 변동될 이름들만 출력해봅시다.
9명 이렇게 출력되면 됩니다.
SELECT 고객명, 사용금액, 고객등급,
CASE
WHEN 사용금액 >= 300000 THEN 'vip'
WHEN 사용금액 >= 200000 THEN '로열'
ELSE '패밀리'
END
FROM card
이러면 어떻게 될까요
현재 고객등급과, 바뀔 new 고객등급이 출력되겠군요.
저희는 이상황에서 바뀐 9명을 구하고 싶은거니까
현재 고객등급 이랑 new 고객등급 중 서로 다른 것을 찾아내면 되지 않을까여??
정답입니다.
SELECT 고객명, 사용금액, 고객등급
FROM card
WHERE 고객등급 != CASE
WHEN 사용금액 >= 300000 THEN 'vip'
WHEN 사용금액 >= 200000 THEN '로열'
ELSE '패밀리'
END
그래서 현재고객등급 ≠ new고객등급 이렇게 필터링 해보았습니다.
잘나옴요 ㅋ
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
컬럼에 안전하게 제약 (Constraints) 주기 (0) | 2024.02.21 |
---|---|
진정한 알파메일은 테이블과 컬럼 생성할 때 쿼리를 쓴다 (0) | 2024.02.21 |
GROUP BY 뽀개기 (0) | 2024.02.19 |
서브쿼리 뽀개기 (0) | 2024.02.19 |
푸바오가 알려주는 컬럼 출력시 사칙연산 & 문자를 다루는 함수 (0) | 2024.02.19 |