SQL Server의 CASE 문 및 중첩 사례: T-SQL 예
⚡ 스마트 요약
CASE는 SQL Server에서 첫 번째 조건이 참으로 평가될 때 값을 반환하는 조건식입니다. 단순형과 검색형 형식을 제공하며, IF…ELSE, UPDATE, ORDER BY 내부에 중첩하여 사용할 수도 있습니다.

실제 케이스 개요!
실생활에서도 우리는 다양한 상황의 결과에 따라 다른 행동을 취합니다. 좀 더 자세히 설명하자면, 아래 예를 살펴보겠습니다.
- 비행기표가 100달러 미만이면 로스앤젤레스를 방문하겠습니다.
- 항공권 가격이 100달러에서 200달러 사이라면 뉴욕에 가겠습니다.
- 항공권 가격이 200달러에서 400달러 사이라면 유럽에 가겠습니다.
- 그렇지 않으면 근처 관광지를 방문하는 것을 선호합니다.
위의 예시와는 별도로, 상황과 행동을 구분하여 분류하는 것을 생각해 보겠습니다.
| 항공권 이용 약관 | 조건이 참일 경우에만 동작이 수행됩니다. |
| Less $ 100보다 | 로스앤젤레스 방문 |
| 달러 사이 100에 $ 200 | 뉴욕 방문 |
| 달러 사이 200에 $ 400 | 유럽 방문 |
| 위의 조건 중 어느 것도 충족되지 않음 | 인근 관광지 |
위 예시에서 볼 수 있듯이, 각 조건의 결과는 서로 다른 행동을 결정합니다. 예를 들어, 방문객은 항공권 가격이 100달러에서 200달러 사이일 때만 뉴욕을 방문하는 행동을 합니다. 마찬가지로, MS의 SQL CASE 문은 또한 서로 다른 조건의 결과에 따라 서로 다른 T-SQL 문을 실행할 수 있는 기능을 제공합니다.
SQL Server의 CASE 문이란 무엇입니까?
CASE 문 SQL 서버 는 의 확장입니다. 다른 경우라면 CASE 문은 IF…ELSE 문과 달리 최대 하나의 조건만 허용하는 것과 달리, MS SQL에서 여러 조건을 적용하여 다양한 작업을 수행할 수 있도록 합니다. CASE 문은 사용자가 정의한 조건에 해당하는 값을 반환합니다.
CASE 문을 사용하는 방법을 배워봅시다. SQL 그리고 다음 섹션에서 그 개념을 설명합니다. MS SQL에는 두 가지 유형의 CASE 문이 있습니다.
- 간단한 사례
- 검색된 CASE
간단한 사례
단순 사례에 대한 구문
CASE <Case_Expression> WHEN Value_1 THEN Statement_1 WHEN Value_2 THEN Statement_2 . . WHEN Value_N THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
이리:
- 매개변수 Case_Expression은 최종적으로 Value_1, Value_2 등과 비교될 표현식을 나타냅니다.
- 매개변수 Statement_1, Statement_2…는 Case_Expression = Value_1, Case_Expression = Value_2 등이 성립할 경우 실행될 문장을 나타냅니다.
- 간단히 말해, 조건은 Case_Expression이 Value_N과 같은지 여부이며, 위 결과가 TRUE이면 Statement_N을 실행하는 것이 동작입니다.
- ALIAS_NAME은 선택 사항이며 SQL Server CASE 문 결과에 부여되는 별칭 이름입니다. 주로 SQL Server SELECT 절에서 CASE를 사용할 때 사용됩니다.
단순 사례에 대한 규칙
- Simple Case는 Case_Expression과 Value_1부터 Value_N까지의 값에 대한 등가성 검사만 허용합니다.
- Case_Expression은 첫 번째 값(즉, Value_1)부터 순서대로 값과 비교됩니다. 실행 방식은 다음과 같습니다.
- Case_Expression이 Value_1과 동일하면 추가 WHEN…THEN 문을 건너뛰고 CASE 실행이 즉시 종료됩니다.
- Case_Expression이 Value_1과 일치하지 않으면, Case_Expression은 Value_2와 비교하여 동일한지 확인합니다. Case_Expression과 Value_2를 비교하는 이 과정은 Case_Expression이 Value_1, Value_2 등의 집합에서 일치하는 값을 찾을 때까지 계속됩니다.
- 일치하는 항목이 없으면 제어는 ELSE 문으로 이동하고 Statement_Else가 실행됩니다.
- ELSE는 선택사항입니다.
- ELSE가 없고 Case_Expression이 어떤 값과도 일치하지 않으면 NULL이 표시됩니다.
아래 다이어그램은 간단한 사례의 실행 흐름을 보여줍니다.
예
'라는 이름의 테이블이 있다고 가정해 봅시다.Guru아래와 같이 Tutorial_ID와 Tutorial_name 두 개의 열과 네 개의 행으로 구성된 '99' 형식의 표입니다. 우리는 이 표를 사용할 것입니다.Guru다음 예시에서는 99' 테이블을 참조하십시오.
쿼리 1: NO ELSE 옵션이 있는 SIMPLE CASE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
결과: 아래 다이어그램은 ELSE 문이 없는 SIMPLE CASE의 실행 흐름을 설명합니다.
쿼리 2: ELSE 옵션이 있는 단순 CASE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
결과: 아래 다이어그램은 ELSE가 포함된 SIMPLE CASE의 실행 흐름을 설명합니다.
검색된 CASE
검색된 케이스의 구문
CASE WHEN <Boolean_Expression_1> THEN Statement_1 WHEN <Boolean_Expression_2> THEN Statement_2 . . WHEN <Boolean_Expression_N> THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
이리:
- 매개변수 Boolean_Expression_1…은 TRUE 또는 FALSE로 평가될 표현식을 나타냅니다.
- 매개변수 Statement_1, Statement_2…는 해당 Boolean_Expression_1, Boolean_Expression_2 결과가 TRUE일 경우 실행될 문장을 나타냅니다.
- 요약하자면, 조건은 Boolean_Expression_1…이고, 동작은 위의 Boolean_Expression_1이 TRUE일 경우 Statement_N을 실행하는 것입니다.
- ALIAS_NAME은 선택 사항이며 CASE 문 결과에 부여되는 별칭입니다. 주로 SELECT 절에서 CASE를 사용할 때 사용됩니다.
검색된 사례에 대한 규칙
- 단순 사례와 달리 검색 사례는 단순히 같음 비교에만 국한되지 않고 부울 표현식도 허용합니다.
- 부울 표현식은 첫 번째 부울 표현식(즉, Boolean_Expression_1)부터 순서대로 평가됩니다. 실행 방식은 다음과 같습니다.
- Boolean_Expression_1이 TRUE이면 이후의 WHEN…THEN 문은 건너뛰고 CASE 실행이 즉시 종료됩니다.
- Boolean_Expression_1이 FALSE이면 Boolean_Expression_2가 TRUE인지 평가됩니다. 이러한 부울 표현식 평가 과정은 두 표현식 중 하나가 TRUE를 반환할 때까지 계속됩니다.
- 일치하는 항목이 없으면 제어는 ELSE 문으로 이동하고 Statement_Else가 실행됩니다.
- 단순 사례와 마찬가지로 검색 사례에서도 ELSE는 선택 사항입니다.
- ELSE 문이 없고 부울 표현식 중 어느 것도 TRUE를 반환하지 않으면 NULL이 표시됩니다.
아래 다이어그램은 검색된 사례의 실행 흐름을 보여줍니다.
예
쿼리 1: NO ELSE 옵션을 사용한 SEARCHED CASE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
결과: 아래 다이어그램은 ELSE가 없는 SEARCHED CASE의 실행 흐름을 설명합니다.
쿼리 2: ELSE 옵션이 있는 검색된 사례
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
결과: 아래 다이어그램은 ELSE가 포함된 검색된 CASE의 실행 흐름을 설명합니다.
실행 방식의 차이점: 단순 실행 방식과 검색 실행 방식
아래의 간단한 예시를 살펴보겠습니다.
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
여기서 'Tutorial_name'은 SQL의 CASE 표현식의 일부입니다. 그런 다음 'Tutorial_name' 값은 각 WHEN 값(즉, 'SQL')과 비교됩니다. 'Tutorial_name'이 WHEN 값과 일치할 때까지 이 과정이 반복됩니다.
반대로, SEARCH CASE 예제에는 CASE 표현식이 없습니다.
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
여기서 각 WHEN 문은 자체적인 조건 부울 표현식을 가지고 있습니다. Tutorial_name = 'SQL'…과 같은 각 부울 표현식은 TRUE/FALSE로 평가되며, TRUE로 평가되는 첫 번째 부울 표현식이 나올 때까지 계속됩니다.
단순 사례와 검색 사례의 차이점
| 간단한 케이스 | 검색된 사례 |
| CASE 키워드 바로 뒤에 CASE_Expression이 오고 WHEN 문 앞에 옵니다.
예 : |
CASE 키워드 다음에는 WHEN 문이 오고, CASE와 WHEN 사이에는 표현식이 없습니다.
예 : |
| 간단한 경우, 각 WHEN 문에는 VALUE 값이 존재합니다. 이러한 값들(Value_1, Value_2…)은 순차적으로 하나의 CASE_Expression과 비교됩니다. 결과는 각 WHEN 문의 TRUE/FALSE 조건에 대해 평가됩니다.
예 : |
검색된 케이스에서는 각 WHEN 문에 대해 Boolean_Expression이 존재합니다. 이러한 Boolean_Expression(Boolean_Expression_1, Boolean_Expression_2…)은 각 WHEN 문의 TRUE/FALSE 조건을 평가합니다.
예 : |
| 단순 케이스는 등호 비교만 지원합니다. 즉, CASE_Expression이 VALUE_1, VALUE_2 등과 같은지 여부를 확인합니다.
예 : |
Boolean_Expression_N을 사용하면 검색된 케이스는 부울 값을 반환하는 모든 연산을 지원합니다. 여기에는 같음 및 같지 않음 연산자가 포함됩니다.
예 : |
중첩된 CASE: IF ELSE의 CASE
IF…ELSE 문 안에서 CASE 문을 사용할 수 있습니다. CASE 문을 선언합니다. 변수 항공권의 경우 해당 값에 따라 분기합니다. 다음은 MS-SQL 코드 예시입니다.
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 190; IF @Flight_Ticket > 400 PRINT 'Visit Nearby Tourist Location'; ELSE BEGIN SELECT CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END AS Location END
위 예시에서 CASE 문은 IF…ELSE 문 안에 중첩되어 있습니다. 먼저 IF 문이 실행되고, SQL Server에서 CASE 조건이 거짓이면 ELSE 문이 실행됩니다. ELSE 부분에는 SQL에서 중첩된 CASE 문이 포함되어 있습니다. 항공권 가격에 따라 다음 결과 중 하나가 표시됩니다.
- 항공권 가격이 400달러를 초과하면 시스템에서 '근처 관광지 방문'이라는 안내를 출력합니다.
- 항공권 가격이 0달러에서 100달러 사이인 경우 시스템에서 '로스앤젤레스 방문'이라고 출력합니다.
- 항공권 가격이 101달러에서 200달러 사이일 경우 시스템에서 '뉴욕 방문'이라고 출력합니다.
- 항공권 가격이 201달러에서 400달러 사이일 경우 시스템에서 '유럽 방문'이라는 문구를 출력합니다.
아래 결과는 중첩된 CASE 문이 ELSE 분기 내에서 실행될 때 반환되는 위치를 보여줍니다.
중첩된 CASE: CASE 내부 CASE
SQL에서는 CASE 절 안에 또 다른 CASE 절을 사용할 수 있습니다. 다음은 MS-SQL 예시 코드입니다.
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 250; SELECT CASE WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.' WHEN @Flight_Ticket < 400 THEN CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END END AS Location
위 예시에서 CASE 문은 또 다른 CASE 문 안에 중첩되어 있습니다. 시스템은 먼저 바깥쪽 CASE 문을 실행하고, Flight_Ticket이 400달러 미만이면 안쪽 CASE 문을 실행합니다. 반환되는 위치는 이전 예시와 동일한 티켓 가격 범위를 따르므로, 250달러짜리 티켓은 201~400달러 범위에 속하여 '유럽 방문'을 반환합니다.
아래 결과는 250달러 티켓에 대해 내부 CASE에서 반환된 위치 정보를 보여줍니다.
업데이트가 포함된 사례
다시 말해, 우리가 '를 가지고 있다고 가정해 봅시다.Guru아래와 같이 두 열과 네 행으로 구성된 99' 테이블:
UPDATE와 함께 CASE를 사용할 수 있습니다. 다음은 MS-SQL 코드의 예입니다.
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
위 예시에서는 UPDATE 문에서 CASE 절이 사용되었습니다. Tutorial_Name 값에 따라 Tutorial_Name 열은 THEN 문 값으로 업데이트됩니다.
- Tutorial_Name이 'SQL'인 경우 Tutorial_Name을 '구조화된 쿼리 언어'로 업데이트합니다.
- Tutorial_Name이 'PL/SQL'인 경우 Tutorial_Name을 '로 업데이트합니다.Oracle PL/SQL'.
- Tutorial_Name이 'MSSQL'인 경우 Tutorial_Name을 '로 업데이트합니다.Microsoft SQL'.
- Tutorial_Name이 'Hadoop'인 경우 Tutorial_Name을 'Apache Hadoop'으로 업데이트합니다.
해당 명령문을 실행하면 아래와 같이 일치하는 행이 업데이트됩니다.
'를 조회해 보겠습니다.Guru업데이트된 값을 확인하려면 99' 테이블을 참조하세요.
CASE(주문 기준)
CASE 절과 ORDER BY 절을 함께 사용할 수 있습니다. 다음은 MS-SQL 코드 예시입니다.
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
여기서는 CASE 절이 ORDER BY 절과 함께 사용됩니다. @Order는 1로 설정되어 있고, 첫 번째 WHEN 부울 표현식이 TRUE로 평가되므로 Tutorial_ID가 ORDER BY 조건에 따라 선택됩니다. 결과는 아래와 같습니다.
흥미로운 사실!
- CASE 문은 다른 CASE 문 안에 중첩될 수 있으며, IF…ELSE 문 안에도 중첩될 수 있습니다.
- SELECT 외에도 CASE 절은 UPDATE 및 ORDER BY와 같은 다른 SQL 절과 함께 사용할 수 있습니다.













