금백조의 개발 블로그

[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE) 본문

Database/SQL Server(MSSQL)

[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE)

금백조 2021. 3. 28. 10:32
반응형

서론

 

개발을 진행하면서 SELECT, WHERE, ORDER BY절에서 CASE문을 통해 원하는 데이터를 추출했던 경험들이 있었습니다. 오늘은 그동안 사용해봤던 경험들을 토대로 SELECT, WHERE, ORDER BY절에서 CASE문을 활용하는 방법을 예제를 통해 소개해보겠습니다.

 


 

본론

 

 

[구문 형식]

 

[SELECT CASE]

 

SELECT CASE WHEN [조건식1] THEN [결과식1]
            WHEN [조건식2] THEN [결과식2]
            ...
            ELSE [조건식N] END

 

[WHERE CASE]

 

SELECT ...
FROM ...
WHERE CASE WHEN [조건식1] THEN 1
           WHEN [조건식2] THEN 1
           ...
           ELSE 0 END = 1

 

[ORDER BY CASE]

 

SELECT ...
FROM ...
WHERE ...
ORDER BY CASE [삽입식] WHEN [조건식1] THEN [결과식1] 
                       WHEN [조건식2] THEN [결과식2]
                       ...
                       ELSE [결과식N] END

 

 

[특징]

 

[SELECT CASE] : WHEN에 적은 조건식에 따라 결과식을 다르게 조회할 수 있습니다.

[WHERE CASE] : 다중 조건식을 써야 할 경우 CASE문을 통해 간결하고 직관적으로 표현이 가능합니다.

[ORDER BY CASE] : 특정 행에 대해서 정렬이 따로 필요할 경우 CASE문을 통해 구현할 수 있습니다.

 

[SELECT CASE 예제]

 

--SELECT절에서 CASE문 활용 예제
SELECT N'C001' AS CLASS_CODE, N'알고리즘' AS CLASS_NAME, 100 AS SCORE
INTO #TEMP_TABLE
UNION ALL
SELECT N'C002' AS CLASS_CODE, N'자료구조' AS CLASS_NAME, 80 AS SCORE
UNION ALL
SELECT N'C003' AS CLASS_CODE, N'JAVA' AS CLASS_NAME, 60 AS SCORE
UNION ALL
SELECT N'C004' AS CLASS_CODE, N'C#' AS CLASS_NAME, 40 AS SCORE
UNION ALL
SELECT N'C005' AS CLASS_CODE, N'데이터베이스' AS CLASS_NAME, 20 AS SCORE
UNION ALL
SELECT N'C006' AS CLASS_CODE, N'네트워크' AS CLASS_NAME, 0 AS SCORE
UNION ALL
SELECT N'C007' AS CLASS_CODE, N'운영체제' AS CLASS_NAME, 99999 AS SCORE
--SELECT절에서 CASE문 활용
--조건식을 통해 각각의 학점(GRADE) 출력
SELECT
	CLASS_CODE,
	CLASS_NAME,
	SCORE,
	CASE WHEN SCORE > 100 OR SCORE < 0 THEN 'Z'--100초과 0미만인 에러 데이터는 Z 표시
	     WHEN SCORE >= 80 AND SCORE <= 100 THEN 'A'--80이상 100이하 = A
	     WHEN SCORE >= 60 AND SCORE < 80 THEN 'B'--60이상 80미만 = B
		 WHEN SCORE >= 40 AND SCORE < 60 THEN 'C'--40이상 60미만 = C
		 WHEN SCORE >= 20 AND SCORE < 40 THEN 'D'--20이상 40미만 = D
		 ELSE 'F' END AS GRADE--0이상 20미만 = F
FROM #TEMP_TABLE

 

 

[WHERE CASE 예제]

 

--WHERE절에서 CASE문 활용 예제
SELECT '과자' AS ITEM_GROUP ,N'단맛과자' AS ITEM, 100 AS SALES_QTY
INTO #TEMP_TABLE
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'쓴맛과자' AS ITEM, 10 AS SALES_QTY
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'짠맛과자' AS ITEM, 50 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'커피' AS ITEM, 150 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'우유' AS ITEM, 200 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'이온음료' AS ITEM, 300 AS SALES_QTY
--WHERE절에서 CASE문을 활용
--과자는 판매수량이 50이상이고 음료는 판매수량이 300이상인 데이터 추출
SELECT
	ITEM_GROUP
	,ITEM
	,SALES_QTY
FROM #TEMP_TABLE
WHERE
	CASE WHEN ITEM_GROUP = '과자' AND SALES_QTY >= 50 THEN 1
         WHEN ITEM_GROUP = '음료' AND SALES_QTY >= 300 THEN 1
         ELSE 0 END = 1
         --아래의 OR 구문과 동일하게 동작
         --(ITEM_GROUP = '과자' AND SALES_QTY >= 50)
         --OR (ITEM_GROUP = '음료' AND SALES_QTY >= 300)

 

 

[ORDER BY CASE 예제]

 

--ORDER BY절에서 CASE문 활용 예제
SELECT '과자' AS ITEM_GROUP ,N'단맛과자' AS ITEM, 100 AS SALES_QTY
INTO #TEMP_TABLE
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'쓴맛과자' AS ITEM, 10 AS SALES_QTY
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'짠맛과자' AS ITEM, 50 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'커피' AS ITEM, 150 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'우유' AS ITEM, 200 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'이온음료' AS ITEM, 300 AS SALES_QTY

SELECT
	 CASE WHEN GROUPING(ITEM_GROUP)+GROUPING(ITEM)=2 THEN '총계'
		  WHEN GROUPING(ITEM_GROUP)+GROUPING(ITEM)=1 THEN ITEM_GROUP+'소계'
		  ELSE ITEM_GROUP END AS ITEM_GROUP
	,ITEM
	,SUM(SALES_QTY) AS SALES_QTY
FROM #TEMP_TABLE
GROUP BY ROLLUP (ITEM_GROUP, ITEM)
--ORDER BY절에서 CASE문 활용
--총계를 맨 위에 정렬되도록 출력
ORDER BY CASE GROUPING(ITEM_GROUP)+GROUPING(ITEM) WHEN 2 THEN '' ELSE 'Z' END, ITEM_GROUP

 

 


 

결론

 

CASE문은 SELECT, WHERE, ORDER BY절뿐만 아니라 SQL 모든 구문에서 활용할 수 있습니다. 따라서 CASE문에 대해 더 다양한 활용법을 알고 싶으신 분들은 아래의 [CASE(Transact-SQL)] 글에서 더욱 다양한 예제를 만나보실 수 있습니다.

 

Reference

 

[CASE(Transact-SQL)]

docs.microsoft.com/ko-kr/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver15

 

CASE(Transact-SQL) - SQL Server

CASE 식의 Transact-SQL 참조입니다. CASE는 조건 목록을 평가하여 특정 결과를 반환합니다.

docs.microsoft.com

 

반응형