SQL - 문자열, Case

박영준·2023년 6월 2일
0

DB

목록 보기
16/41

1. 문자열

  • 문자열 데이터를 원하는 형태로 정리할 수 있다.

1) 사용법

(1) SUBSTRING_INDEX 문자열 쪼개기

예시 1 : 이메일 주소에서 @앞의 아이디만 가져온다

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
  • @ 를 기준으로, 텍스트(email)를 쪼개고, 그 중 첫 번째 조각(1)을 가져와라.

예시 2 : 이메일 주소에서 @뒤의 이메일 도메인을 가져온다

select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
  • @ 를 기준으로, 텍스트(email)를 쪼개고, 그 중 첫 번째 조각(-1)을 가져와라.

예시 3 : 이메일 도메인별 유저의 수 세어보기

select domain, count(*) as cnt from (
	select SUBSTRING_INDEX(email,'@',-1) as domain from users
) a
group by domain

(2) SUBSTRING 문자열 일부만 출력하기

예시 1 : orders 테이블에서 날짜까지 출력

# 문법
SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 몇개의 글자를 출력하고 싶은지)

# 예시
select order_no, created_at, substring(created_at,1,10) as date from orders

예시 2 : 일별로 몇 개씩 주문이 일어났는지

select substring(created_at,1,10) as date, count(*) as cnt_date from orders
group by date

예시 3 : 시간만 자르기

select created_at, substring(created_at,12,8) from orders

2. Case

  • 구간별로 표시하고 싶은 경우

1) 사용법

예시 1 : 포인트 보유액에 따라 다르게 표시

select pu.point_user_id, pu.point,
		(case when pu.point > 10000 then '잘 하고 있어요!'	   # if 로 간주
		else '조금 더 달려주세요!' end) as '구분'					# else 로 간주.	end는 case절을 끝낸다.
  from point_users pu;

예시 2 : 2개의 when

select pu.point_user_id, pu.point,
		(case when pu.point >= 10000 then '1만 이상'
			  when pu.point >= 5000 then '5천 이상'
			  else '5천 미만' end) as level
  from point_users pu

예시 3 : case(2개의 when) + group by

select level, count(*) as cnt from (
	select pu.point_user_id, pu.point,
		(case when pu.point >= 10000 then '1만 이상'
			  when pu.point >= 5000 then '5천 이상'
			  else '5천 미만' end) as level
  	  from point_users pu
) a
group by level

예시 4 : case(2개의 when) + group by + with

with table1 as (
	select pu.point_user_id, pu.point,
		(case when pu.point >= 10000 then '1만 이상'
			  when pu.point >= 5000 then '5천 이상'
			  else '5천 미만' end) as level
  	  from point_users pu
)

select a.level, count(*) as cnt from table1 a		# 위에서 정의한 table1를 가져다 쓴다
group by a.level

예시 5 : case + avg - 평균 이상 포인트를 가지고 있으면 '잘 하고 있어요' / 낮으면 '열심히 합시다!' 표시

select pu.point_user_id, pu.point,
		(case when pu.point > (select avg(pu2.point) from point_users pu2) then '잘 하고 있어요!'
			  else '열심히 합시다!' end) as 'msg'
  from point_users pu
  • (select avg(pu2.point) from point_users pu2)
    • 5000 대신에 들어간다
    • () 괄호를 쳐줘야 한다.

profile
개발자로 거듭나기!

0개의 댓글