Mysql&DBeaver

DBeaver)중요한 IF / CASE 문법

연습노트 2024. 9. 6. 13:14

자주 쓰는 IF 함수

 

SQL 짜다 보면 문자나 숫자같은 데이터 넣는 곳이 많습니다.

근데 그 곳에 고정된 값이 아니라 조건에 따라서 각각 다른 값을 넣고 싶은 경우 사용하면 됩니다. 

 

IF(조건식, 조건식맞으면이거, 조건식틀리면이거); 

IF() 안에 차례로 이것들 넣으면 됩니다. 

조건식은 WHERE 뒤에 쓰던거 그대로 사용가능합니다. 

 

 

 

SELECT IF(1 + 2 = 3, '맞음', '틀림'); 

조건식이 맞으니 '맞음'이라는 문자가 그 자리에 남겠군요.

진짠지 궁금하면 출력해봅시다. 

IF()는 문자 숫자 등의 데이터가 들어가는 곳에 전부 넣을 수 있기 때문에 

이렇게 사용할 수도 있습니다. 

 

 

 

 

 

 

예를 들어서 card 테이블에서 

사용금액이 20만원이 넘는 경우 "우수" 그게 아니면 "거지"를 출력하고 싶다면 

 

SELECT 고객명, 사용금액, IF(사용금액>200000, "우수", "거지") FROM card; 

이런 식으로 코드를 짜면 되겠군요. 

SELECT 뒤에 컬럼명이 아니라 숫자나 문자 넣으면 그대로 출력해주는데

숫자나 문자 말고 IF()를 넣어본 것입니다. 

 

 

 

 

 

▲ 진짜네요 

 

 

 

하지만 IF() 의 단점이 있는데 조건이 맞으면 A, 틀리면 B 이렇게 2개 경우만 만들 수 있다는겁니다.

사용금액이 20만원 이상이면 '우수'

사용금액이 10~20만원이면 '준수'

사용금액이 10만원 미만이면 '그지'

이렇게 경우를 3개 이상 만들고 싶으면 어떻게 하죠? 

 

경우를 3개 이상 둬야한다면 IF()안에 IF()를 또 쓰거나 해도 되는데

그것 보다는 좀 더 직관적인 CASE 문법을 사용합니다. 

 

 

 

 

 

 

 

CASE 문법 

 

문자나 숫자같은 데이터넣는 자리에 CASE 문법을 넣을 수 있습니다. 

CASE 문법 안에 조건식과 조건식이 맞으면 남길 값을 매우 많이 넣을 수 있습니다. 

 

CASE 
  WHEN 조건식1 THEN 남길값1
  WHEN 조건식2 THEN 남길값2
  WHEN 조건식3 THEN 남길값3
END 

CASE/END 사이에 WHEN 조건식 THEN 남길값을 여러개 넣을 수 있는데 

컴퓨터는 조건식을 위에서 부터 차례차례 실행해보면서

1. 조건식에 맞을 경우 2. 남길값을 그 자리에 남겨주고 3. CASE 문법을 종료합니다. 

 

 

 

 

그래서 아까 문제를 살펴봅시다. 

사용금액이 20만원 이상이면 '우수'

사용금액이 10~20만원이면 '준수'

사용금액이 10만원 미만이면 '그지'

이걸 출력하고 싶으면 CASE 문법을 어떻게 쓰면 되겠습니까  

아까 IF() 쓰던 자리에 CASE를 써서 구현해봅시다.

답만 보지 말고 알아서 해봅시다

 

 

SELECT 고객명, 사용금액,

CASE
  WHEN 사용금액 >= 200000 THEN '우수'
  WHEN 사용금액 >= 100000 AND 사용금액 < 200000 THEN '준수'
  WHEN 사용금액 < 100000 THEN '그지' 
END

FROM card; 

이런 식으로 코드를 짜면 되겠군요. 

실은 코드가 위에서 부터 한 줄 한 줄 실행되고

조건식에 맞으면 바로 CASE 문법을 종료하기 때문에

WHEN 사용금액 >= 100000  THEN '준수' 이걸로 바꿔도 잘 실행되지않을까요?

생각해봅시다. 

 

[collapse]

 

 

 

 

 

 

CASE 
  WHEN 조건식1 THEN 남길값1
  WHEN 조건식2 THEN 남길값2
  WHEN 조건식3 THEN 남길값3
  ELSE 남길값4
END 

심심하면 ELSE 문법도 가장 마지막 줄에 추가할 수 있는데 

그럼 조건식들이 전부 맞지 않을 경우 ELSE 우측에 있는 값을 남겨줍니다. 

 

그래서 오늘도 문법의 용도를 잘 기억해둡시다.

어떤 문자나 숫자를 경우에 따라 다르게 남기고 싶으면 IF() 쓰면 되는데

경우가 3개 이상이면 CASE 씁시다. 

 

 

 

 

 

집계함수와 같이 사용해도 됩니다. 문제 하나만 풀어봅시다. 

Q. 등급이 vip인 사람들은 3점, 로열이면 2점, 패밀리면 1점으로 계산해서

모든 고객의 점수를 다 더하면 몇점일까요? 

 

 

SELECT SUM(3) FROM card

이러면 그냥 3을 다 더해줍니다. card 테이블의 행의 갯수만큼 더해줍니다.  

근데 3만 계속 더하는게 아니라 경우에 따라서 2, 1도 넣어야합니다.

그럼 3이라고 저렇게 하드코딩해놓는게 아니라 그 자리에 IF() 아니면 CASE 문법 쓰면 되는게 아닐까요?

써봅시다. 

 

 

 

 

 

SELECT SUM(
  CASE
    WHEN 고객등급 = 'vip' THEN 3 
    WHEN 고객등급 = '로열' THEN 2 
    ELSE 1
  END
) 

FROM card

이러면 경우에 따라서 SUM() 안에 3을 남기거나 2를 남기거나 1을 남겨주겠군요. 

그래서 결론은 숫자, 문자 등 데이터가 들어가는 곳이라면 IF(), CASE 문법 맘대로 사용가능합니다. 

IF, CASE 문법은 자주 사용하니 까먹으면 안됩니다. 

 

 

 

 

 

 

 

 

Q1. card 테이블에서 장부를 조작하려고 합니다.

사용금액 30만원 이상은 50% 증액, 30만원 미만은 10% 증액해서

사용금액의 총 합계를 출력해봅시다. 답은 5147550로 나오면 정답입니다. 

(예시) 사용금액이 40만원인 행은 60만원으로, 20만원인 행은 22만원으로 바꿔서 더해보라는 소리입니다. 

 

더하기 어렵다면 출력부터 해보면 됩니다

 

SELECT SUM(
IF( 사용금액 >= 300000, 사용금액 * 1.5, 사용금액 * 1.1 )
) FROM mart.card  

SUM() 안에 사용금액을 대충 넣는게 아니라 

때로는 사용금액 x 1.5

때로는 사용금액 x 1.1

을 하고 싶어서 IF() 를 써봤을 뿐입니다. 

 

아직 안알랴줌 

 

[collapse]

 

 

Q2. 고객등급을 재설정하려고 합니다.

사용금액이 30만원 이상은 'vip'

20만원 이상 30만원 미만은 '로열'

그 외엔 '패밀리'로 다시 설정하려고 합니다. 

고객등급이 변동될 이름들만 출력해봅시다. 

 

 

9명 이렇게 잘 출력되면 됩니다. 

 

힌트는 현재등급과 바뀔등급을 각각 출력해봅시다.

 

SELECT 고객명, 사용금액, 고객등급,
CASE 
    WHEN 사용금액 >= 300000 THEN 'vip'
    WHEN 사용금액 >= 200000 THEN '로열'
    ELSE '패밀리'
END 
FROM card

이러면 현재 고객등급과 바뀔 고객등급이 차례로 출력되겠군요.

이 상황에서 현재 고객등급 != 바뀔 고객등급인 행만 필터링하면 되는 것이 아닐까요 

 

 

 

SELECT 고객명, 사용금액, 고객등급
FROM card
WHERE 고객등급 != CASE 
    WHEN 사용금액 >= 300000 THEN 'vip'
    WHEN 사용금액 >= 200000 THEN '로열'
    ELSE '패밀리'
END 

그래서 고객등급 != 바뀔등급 이렇게 필터링해보았습니다. 

잘 나올듯요