[SQL] 조건별 데이터 연산 - IF, CASE

2024. 8. 16. 22:30Language/SQL

 Java 의 'if 문' 처럼 조건에 따라 다른 연산을 지정할 수 있는 방법이 SQL 에도 존재한다. 이번에는 조건을 지정하고 조건에 따라 다른 연산을 하는 방법에 대해 알아보자.

 

1. 기본 문법

SELECT IF(조건식, 조건충족시, 조건불충족시) 별명,
       CASE WHEN 조건1 then 값1
            WHEN 조건2 then 값2
            ELSE 값3
       END
FROM 테이블명
  • IF : 조건식을 지정하고, 해당 조건을 만족하는 참(true)일 경우의 값과 만족하지 않는 거짓(false)일 경우의 값을 지정해 참/거짓 여부에 따라 다른 연산을 할 수 있다.
  • CASE : 다수의 조건을 지정하고 조건별로 만족시 수행되는 수식 또는 값을 지정할 수 있다. 지정 조건외의 모든 경우는 ELSE 를 사용해 값(수직)을 지정할 수 있으며 END 를 사용해 해당 구문을 끝낸다.

 

 

2. 사용 예시

2-1. IF

 'food_orders' 테이블에서 각 음식점별 음식 가격 평가를 출력해보자. 가격 평가는 음식 평균가격이 15000원이 넘으면 비싸고 이하라면 싸다 평가한다.

SELECT restaurant_name, IF(AVG(price) > 15000, '비싼 편', '저렴한 편') '가격 평가'
FROM food_orders
GROUP BY restaurant_name

조건별 데이터 연산 결과

 

GROUP BY 로 'restaurant_name' 을 그룹화하고 IF 를 사용해 조건별 연산을 지정한다. 조건식에 AVG 를 사용해 각 음식점별 음식 가격의 평균을 구해 15000 보다 큰지 비교한다. 크다면 "비싼 편" 이란 평가를 작다면 "저렴한 편" 이란 평가를 지정한다.

 

2-2. CASE

 주문 음식 금액에 따른 배달료를 조회하는 쿼리를 작성하자. 배달료 책정은 10000원 이하는 3000원, 10000원 초과 20000원 이하는 1000원, 그 외 금액은 무료(0원)이다.

SELECT order_id, price,
       CASE WHEN price <= 10000 THEN 3000
            WHEN price > 10000 AND price <= 20000 THEN 1000
            ELSE 0
       END '배달료'
FROM food_orders

다수 조건별 데이터 연산 결과

 

2-3. 고객의 연령대 및 성별

 나이가 10세 이상 40세 미만인 고객들의 연령대와 성별을 한 컬럼에 출력하는 쿼리를 작성해보자.

SELECT name, age, gender,
       CASE WHEN age LIKE '1%' THEN CONCAT('10대 ', IF(gender = male, '남성', '여성'))
            WHEN age LIKE '2%' THEN CONCAT('20대 ', IF(gender = male, '남성', '여성'))
            ELSE CONCAT('30대 ', IF(gender = 'male', '남성', '여성')
       END '연령대 및 성별'
FROM customers
WHERE age >= 10 AND age < 40

연령대 및 성별 조회

 

WHERE 를 사용해 10세 이상 40세 미만의 고객들을 추리고 CASE 를 사용해 연령대와 성별을 한 눈에 확인할 수 있는 컬럼을 결과에 추가했다. 또한 IF 를 조건 충족 값 지정시 사용해 성별에 "male" 을 가지고 있다면 "남성" 을 아니라면 "여성"을 출력, 이를 CONCAT 으로 합쳐 하나의 문자 데이터로 만들었다.