SQL,Database

IF, CASE

seungmin576 2024. 11. 25. 16:21

 IF

어떤 조건에 의하여 나타내는 데이터를 변경하고 싶을 때 사용

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

 

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

글자를 추출하여 보여주는데 안의 조건이 있고 (IF문 시작부터 끝까지. 즉  'IF ~ EMAIL)' 까지가 조건),

시작은 10번째 글자부터, 끝까지 보여주고 (몇글자까지 추출할지 생략 가능한데 시작인 10만 써놓았고 마지막을 적지 않았음 이처럼 생략할 경우에는 10번째 글자부터 끝까지 추출함)

이 컬럼의 별명을 "이메일 도메인" 이라고 해주세요.

 

조건은

만약 EMAIL 컬럼 데이터 중 'GMAIL' 이라는 단어가 포함 되면, (IF( ~ %GMAIL%'))

EMAIL 컬럼의 데이터 안의 'GMAIL' 이라는 단어를 '@GMAIL' 로 바꿔주세요. (REPLACE( ~ '@GMAIL'))

그 외의 조건은 EMAIL 컬럼의 데이터를 그대로 보여주세요. ( EMAIL) )

 

CUSTOMER_ID 컬럼의 데이터 수를 "고객 수" 라는 별명으로 보여주세요. 

AGE 컬럼 데이터의 평균을 "평균 연령"이라는 별명으로 보여주세요.

 

CUSTOMERS 테이블에서

"이메일 도메인"이라 별명 붙인 컬럼을 그룹으로 묶어 보여주세요.

@ 앞까지의 이메일 주소를 8글자로 통일 해놨어서 SUBSTR 10을 했더니 @ 뒤의 주소들만 출력된다. 그 이유는 특수문자는 2칸을 차지해서 영문 8칸 + @ 2칸 = 10칸이기 때문이다.

 

 

 

CASE WHEN

각 조건 별로 적용할 값을 지정할 때이다.

ELSE 생략 가능

 

CASE WHEN '컬럼명'(식 사용 가능) THEN '적용값' (이후로는 조건과 적용값마다 WHEN THEN 쭉쭉 쓰면됨.) ELSE '조건 외의 경우 적용값' END

select 
       restaurant_name,
       addr,
       case 
	   when addr like '%경기도%' then '경기도'
           when addr like '%특별%' or addr like '%광역%' then substring(addr, 1, 5)
           else substring(addr, 1, 2) 
       end "변경된 주소"
from food_orders

ADDR 컬럼의 데이터가 '경기도' 라는 단어를 포함하면 '경기도' 라는 결과 값을,

'특별' 혹은 '광역'이라는 단어를 포함하면 ADDR 컬럼의 첫번째 문자부터 5개의 문자를 보여줘.

나머지의 경우에는 ADDR 컬럼의 첫번째 문자부터 2개의 문자를 보여줘.

이를 '변경된 주소' 라는 별명의 컬럼으로 보여줘.

서울특별시는 '특별' 이라는 글자 포함 조건에 의해 첫번째 글자부터 다섯개 글자인 '서울특별시' 가 출력되고, 광주직할시는 조건에 부합하지 않아 ELSE 에 의해 결과값이 광주만 출력된다. 경기도는 '경기도' 단어 포함 조건에 의해 '경기도'.가 출력되고. 부산광역시나 인천광역시는 '광역' 조건에 부합하여 저런 결과가 나온다.

 

case 문 안에 if 문 넣기도 가능하다.

SELECT 
	CASE 
		WHEN day_of_the_week = 'weekday' THEN 3000 * IF(quantity > 3, 1.2, 1)
		WHEN day_of_the_week = 'weekend' THEN 3500 * IF(quantity > 3, 1.2, 1)
	END "배달할증료",
	restaurant_name,
	order_id,
	day_of_the_week,
	quantity
FROM food_orders

평일에는 3000원 허나 종류가 3개 초과하여 배달할시 1.2배 곱하고 아니면 1배 곱하라.

주말에는 3500원 허나 종류가 3개 초과하여 배달할시 1.2배 곱하고 아니면 1배 곱하라.

이를 "배달할증료" 라는 별명을 붙인 컬럼으로 보여줘.

주말이냐 평일에 따라 수수료가 다른걸 알 수 있다. 5번째 행의 3600원은 평일이지만 4개를 시켰기 때문에 3000 * 1.2 = 3600원이 나왔다.