L모 기업 1차 면접에 합격해 2차면접을 준비해야 한다. 면접 준비와 SQLD 준비를 병행하기로 했다. 오늘은 6장 조건 CASE와 IF를 공부했다.
SELECT문에서 어떤 경우에는 AA, 다른 경우는 BB와 같이 조건 분류 처리가 필요할 때 사용한다.
(CASE
WHEN 조건1 THEN 처리1
WHEN 조건2 THEN 처리2
//...
ELSE 처리0
END)
위에서 순서대로 조건을 체크해 나가 해당하는 시점의 처리에서 종료한다.
CASE ~ END까지 하나의 CASE문이다.
WHEN은 여러개 사용이 가능하며, ELSE는 없어도 된다.
AS를 이용해 CASE문에도 별명을 붙일 수 있다. CASE 문은 가독성을 위해 ()로 감싸면 좋다.
예시
delivery 테이블에서 배송 요금표에 맞게 배송료를 레코드별로 계산해라.
SELECT customer, quantity,
(CASE
WHEN quantity <= 3 THEN 1000
WHEN quantity <= 7 THEN 1200
WHEN quantity <= 10 THEN 1500
ELSE 2000
END) AS delivery_fee
FROM delivery;
CASE 뒤에 컬럼명을 적고 해당 컬럼의 레코드가 WHEN의 값과 일치하면 처리한다.
(CASE 컬럼명
WHEN 값1 THEN 처리1
WHEN 값2 THEN 처리2
WHEN 값3 THEN 처리3
//...
ELSE 처리0
END)
문자열이나 날짜는 ''이나 ""로 감싼다.
예시
SELECT customer,
(CASE delivery_time
WHEN 1 THEN '오전'
WHEN 2 THEN '오후'
WHEN 3 THEN '야간'
ELSE '지정없음'
END) AS delivery_fee
FROM delivery;
CASE 처럼 조건 처리에 사용된다.
MySQL의 함수라서 다른 DBMS는 IF가 없거나 문법이 다르거나 같은 기능의 다른 함수가 있을 수 있다.
IF(조건, TRUE 시 반환 값, FALSE 시 반환 값)
CASE처럼 AS로 별명을 붙일 수 있다.
예시
SELECT customer, quantity,
IF(quantity > 5, '있음', '없음') AS novelty
FROM delivery;
IF 함수 안에 IF 함수를 넣어 더 자세하게 조건을 분류할 수 있다.
IF
(조건1,
조건1이 TRUE일 때 반환하는 값,
IF(
조건2,
조건2가 TRUE일 때 반환하는 값,
조건2가 FALSE일 때 반환하는 값
)
)
위의 방법으로 조건1이 false일때 조건 2를 새로 넣는 방식으로 IF 함수를 중첩해 사용할 수 있다.
단, 가독성이 떨어지므로 줄바꿈이나 괄호를 사용해 보기 좋게 만드는 것이 좋다.
SELECT customer, quantity,
IF(
quantity > 5,
'많음',
IF(
quantity > 3,
'다음 번 할인',
'없음'
)
) AS novelty
FROM delivery;
CASE나 IF는 ORDER BY나 WHERE문에서 사용이 가능하다.
SELECT *
FROM delivery
ORDER BY
CASE delivery_time
WHEN 1 THEN 3
WHEN 2 THEN 1
WHEN 3 THEN 2
ELSE 4
END;
SELECT *
FROM newinfo
WHERE
(CASE
WHEN id < 3 THEN release_date
WHEN id < 5 THEN regist_date
ELSE release_date
END) > '2020-02-03';