지난 글에서는 쿼리 내 또다른 쿼리를 사용할 수 있는 Subquery와 서브쿼리 사용 시 쿼리의 가독성을 높여줄 수 있는 With에 대해 알아봤습니다.

이번 글에서는 텍스트를 나눠서 표현할 수 있는 String과 조건에 따라서 데이터를 다르게 표시할 수 있는 Case에 대해 알아보겠습니다.

(지난 글은 여기에서 확인 가능합니다.)

 

SQL 기초 - String, Case

텍스트 나누기 String

테이블에 저장된 데이터를 그대로 조회하는 것도 가능하지만 때에 따라서는 데이터를 일부만 출력하고 싶은 경우도 있을 수 있습니다.

예를 들어, 이메일 주소 중에 도메인 부분만 출력하거나 아이디 부분만 출력이 필요한 경우도 있을 수 있고, 혹은 날짜 데이터 중 연도만 확인하고 싶은 경우도 있을 수 있습니다.

이러한 경우에 사용하는 것이 String입니다.

 

Substring_index와 String에 대해 알아보겠습니다.

구분자로 텍스트 나누기 Substring_index

위에서 설명한 예시 중 이메일 주소의 아이디와 도메인을 구분하고 싶은 경우 이메일 주소의 아이디, 도메인 구분 기호인 '@'으로 데이터를 나누어 볼 수 있습니다.

Substring_index의 형태는 다음과 같습니다.

substring_index(필드명, '구분자', 1 or -1)
-- 1은 구분자 기준 앞, -1은 구분자 기준 뒤 데이터를 가져옵니다. --

만약, user라는 테이블에 email 필드에서 이메일의 아이디 부분만 조회하고 싶다면 아래와 같은 쿼리로 사용할 수 있을 것입니다.

select substring_index(email,'@',1) from user;

텍스트 일부만 출력하기 String

위에서 설명한 예시 중 날짜 데이터의 특정 부분만 조회하고 싶은 경우에는 만약, 날짜 데이터가 2023-04-09 13:00:00 처럼 년, 월, 일, 시간까지 표시되어있는데 년, 월, 일까지만 보고 싶을 수 있습니다.

이러한 경우 String을 사용하게 되며, String의 형태는 다음과 같습니다.

string(필드명,시작 글자 순서, 끝 글자 순서)

만약, user라는 테이블에 created_time 필드에서 날짜만 조회하고 싶은 경우 아래 쿼리를 사용할 수 있습니다.

-- created_time 필드의 형식이 2023-04-09 13:00:00 라고 가정합니다. --
select string(created_time,1,10) from user;

이렇게 substring_index, string을 사용해서 텍스트를 특정 구분자로 구분하거나 혹은 텍스트의 일정 부분만 별도로 조회하는 것이 가능합니다.

조건에 따라 데이터 표시하기 Case

Case를 사용하면 데이터에 조건을 걸어 특정 조건일 때 다르게 표시하는 것도 가능합니다.
(엑셀에서 If를 사용하는 것과 유사하다고 생각하면 됩니다.)

 

Case의 구조는 아래와 같습니다.

select 필드명1,
       필드명2,
       case when 조건1 then '출력1'
       		else '출력2' end as 필드명3
  from 테이블명;

이렇게 표시되는 필드에 case를 사용해 조건 1일 때는 출력1을 표시하고 조건 1이 아닐 때는 출력2 를 표시하도록 설정할 수 있습니다.

(조회되는 테이블에서 보기 쉽도록 필드명3을 별칭 처리했습니다.)

Case와 Subquery를 사용해 통계 조회하기

위 예시처럼 조회된 case 문을 서브쿼리화해서 group by와 함께 사용하면 case 문에 따른 통계를 확인하는 것도 가능합니다.

조회된 case문을 from 서브쿼리 (가상의 테이블이라고 생각) 한 후 group by를 통해 통계를 낼 수 있습니다.

select 필드명3,
	   count(*)
  from (
  	select 필드명1,
           필드명2,
       	   case when 조건1 then '출력1'
       		else '출력2' end as 필드명3
      from 테이블명;
  ) as 테이블명(별칭)
  group by 테이블명(별칭).필드명3;

이렇게 표현하는 것이 복잡하다면 With 절로 표현하는 것도 가능합니다.

with table1 as (select 필드명1,필드명2,
	case when 조건1 then '출력1' else '출력2' end as 필드명3 from 테이블명;)
                  
select 필드명3, count(*) from table1 group by 필드명3;

이번 글에서는 텍스트를 나눠서 표현할 수 있는 String과 조건에 따라서 데이터를 다르게 표시할 수 있는 Case에 대해 알아봤습니다.

이전 글에서 다뤘던 다른 문법과 함께 사용한다면 더욱 다양한 데이터 분석이 가능할 것 같습니다.

 

감사합니다.

손한량

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기