카테고리 없음

20250207 SQL 3-2주차 : 조건에 따라 포맷을 다르게 변경해야 한다면

ddh1713 2025. 2. 7. 20:59
< 1 > IF

 

[1] 함수명 : if

 

[2] 사용 방법

if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)

 

[예시 1]

select restaurant_name,
	cuisine_type "원래 음식 타입",
    if(cuisine_type='Korean', '한식', '기타') "음식 타입"
from food_orders

 

해석
만약 cuisine_type 이 Korean 이면 컬럼을 '한식' 으로 해주고,
그렇지 않은 컬럼은 '기타'로 표시한다.

 

[예시 2] '문곡리'가 평택에만 해당될 때, 평택 '문곡리'만 '문가리'로 수정

select addr "원래주소",
	if(addr like '%평택군%' replace(addr, '문곡리', '문가리'), addr) "바뀐 주소"
from food_orders
where addr like '%문곡리%'

 

[예시 3] 이메일 도메인에서 잘못된 이메일 주소 (gmail) 만 수정을 해서 사용

select substring(if(email like '%email%', replace(email, 'gmail', '@gmail'), email), 10),
	count(customer_id) "고객 수",
    avg(age) "평균 연령"
from customers
group by 1

 

< 2 > CASE

 

 조건을 여러가지 지정하고 싶을 때 사용한다.

 조건별로 지정을 해주기 때문에 if 문을 여러 번 쓴 효과를 낼 수 있다.

 

 case(조건1, 값1, case(조건2, 값2, 값3))

 

[1] 함수명 : case

 

[2] 사용 방법

case when 조건1 then 값(수식)1
	when 조건2 then 값(수식)2
    else 값(수식)3
end

 

[예시 1] 음식 타입을 'Korean' 일 때는 '한식', 'Japanese' 혹은 "Chinese' 일 때는 '아시아', 그 외에는 '기타'라고 지정

select case when cuisine_type='Korean' then '한식'
		when cuisine_type= in ('Japanese', 'Chinese') then '아시아'
        else '기타' end "음식 타입",
        cuisine_type
from food_orders

 

[예시 2] 음식 단가를 주문 수량이 1일 때는 음식 가격, 주문 수량이 2개 이상일 때는 음식가격/주문수량으로 지정

select order_id,
	price,
    quantity,
    case when quantity=1 then price
    	when quantity>=2 then price/quantity end "음식 단가"
 from food_orders

 

< 3 > 조건을 사용할 수 있는 경우

 

[1] 새로운 카테고리 만들기

 

음식 타입과 같이 새로운 카테고리를 만들 수 있다.

 (예) 한국 음식, 아시아 음식, 미국 음식, 유럽 음식

 

고객들의 분류도 만들 수 있다.

 (예) 10대 여성, 10대 남성, 20대 여성, 20대 남성 등

 

[2] 연산식을 적용할 조건 지정하기

 

수수료를 계산할 때, 현금 사용과 카드 사용 등으로 나눌 수 있다.

 현금일 때와 카드일 때의 수수료율이 다르다면, if 문 또는 case 문을 사용하여 각각 다른 수수료율 혹은 수수료 계산 방식을 적용할 수 있다.

 

[3] 다른 문법 안에서 적용하기

 

if , case 문 안에 다른 문법이나 연산을 넣을 수도 있지만, 다른 문법 안에 조건문을 넣을 수 있다.

 

< 4 > 숫자 계산이나 문자 가공 시 자주 발생하는 오류 알아보기

 

다른 SQL 문법에서는 data type 이 다를 때 연산이 되지 않을 수 있음.

문자, 숫자를 혼합하여 함수에 사용할 때에는 데이터 타입을 변경해줘야 한다.

-- 숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal)

-- 문자로 변경
concat(restaurant_name, '-', cast(order_id as char))