231101 TIL #231 SQL #6 CASE / IF

김춘복·2023년 11월 1일
0

TIL : Today I Learned

목록 보기
231/543
post-custom-banner

Today I Learned

L모 기업 1차 면접에 합격해 2차면접을 준비해야 한다. 면접 준비와 SQLD 준비를 병행하기로 했다. 오늘은 6장 조건 CASE와 IF를 공부했다.


CASE

SELECT문에서 어떤 경우에는 AA, 다른 경우는 BB와 같이 조건 분류 처리가 필요할 때 사용한다.

사용법 1

(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;

사용법 2

CASE 뒤에 컬럼명을 적고 해당 컬럼의 레코드가 WHEN의 값과 일치하면 처리한다.

(CASE 컬럼명
 WHEN1 THEN 처리1
 WHEN2 THEN 처리2
 WHEN3 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;


IF

CASE 처럼 조건 처리에 사용된다.
MySQL의 함수라서 다른 DBMS는 IF가 없거나 문법이 다르거나 같은 기능의 다른 함수가 있을 수 있다.

  • 사용법
IF(조건, TRUE 시 반환 값, FALSE 시 반환 값)
  • CASE처럼 AS로 별명을 붙일 수 있다.

  • 예시

SELECT customer, quantity,
IF(quantity > 5, '있음', '없음') AS novelty
FROM delivery;

IF함수의 중첩

IF 함수 안에 IF 함수를 넣어 더 자세하게 조건을 분류할 수 있다.

  • 사용법
IF
 (조건1,
 조건1TRUE일 때 반환하는 값,
 IF(
  조건2,
  조건2TRUE일 때 반환하는 값,
  조건2FALSE일 때 반환하는 값
 )
)

위의 방법으로 조건1이 false일때 조건 2를 새로 넣는 방식으로 IF 함수를 중첩해 사용할 수 있다.
단, 가독성이 떨어지므로 줄바꿈이나 괄호를 사용해 보기 좋게 만드는 것이 좋다.

  • 예시
    quantity가 5보다 많으면 많음, 3보다 많으면 다음번 할인, 해당하지 않으면 없음으로 표시.
SELECT customer, quantity,
IF(
	quantity > 5,
    '많음',
    IF(
		quantity > 3,
        '다음 번 할인',
        '없음'
        )
	) AS novelty
FROM delivery;

다른 구에서의 조건문

CASE나 IF는 ORDER BY나 WHERE문에서 사용이 가능하다.

  • CASE in ORDER BY (조건에 따라 정렬 순서 변경)
    delivery 테이블을 delivery_time의 값을 기준으로 2,3,1,나머지 순으로 정렬한다.
SELECT *
FROM delivery
ORDER BY
 CASE delivery_time
	WHEN 1 THEN 3
    WHEN 2 THEN 1
    WHEN 3 THEN 2
    ELSE 4
 END;

  • CASE in WHERE (조건으로 비교하는 값을 CASE로 분류)
    newinfo 테이블에서 id가 3미만이면 release_date로, 5미만이면 regist_date로, 나머지는 release_date를 '2020-02-03'과 비교해 더 최신의 날짜면 가져와라.
SELECT *
FROM newinfo
WHERE
 (CASE
 	WHEN id < 3 THEN release_date
    WHEN id < 5 THEN regist_date
    ELSE release_date
  END) > '2020-02-03';

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글