티스토리 뷰

SQL Server 2012 T-SQL: CHOOSE, IIF 논리함수

 

새롭게 제공되는 내용 중에서 CHOOSE, IIF를 한번 사용해보도록 하겠습니다.

SELECT 구문에서 조건에 따라 값을 나타내려고 할 경우 CASE WHEN 문을 사용해서 처리했습니다. CASE 구문을 작성하면 코드가 길어지고 가독성이 좀 떨어지는 측면이 있었습니다.

 
l  CHOOSE

SQL Server 2012에서는 보다 더 간결하고 쉽게 처리 가능한 CHOOSE, IIF 구문이 제공됩니다.

아래 구문을 한번 살펴보시죠~

 

SELECT  CASE DATEPART(WEEKDAY, GETDATE())

                                WHEN 1 THEN N'일요일'

                                WHEN 2 THEN N'월요일'

                                WHEN 3 THEN N'화요일'

                                WHEN 4 THEN N'수요일'

                                WHEN 5 THEN N'목요일'

                                WHEN 6 THEN N'금요일'

                                WHEN 7 THEN N'토요일'

                     END

 

위 구문의 경우는 CASE WHEN 구문으로 작성한 내용인데 CHOOSE 구문으로 변경해보도록 하겠습니다. 더 간결해보입니다.

SELECT CHOOSE(DATEPART(WEEKDAY, GETDATE())                     , N'일요일',N'월요일',N'화요일',N'수요일',N'목요일',N'금요일',N'토요일')

 

CHOOSE 논리함수의 구문의 규칙은 아래와 같습니다.

CHOOSE ( index, val_1, val_2 [, val_n ] )

 

Index 1부터 시작하는 정수이며 val_1.., 등은 인덱스에 매치되는 임의의 데이터 형식입니다.

그러므로 1부터 반환하는 정수가 나오는 인수를 맨 처음에, 나머지는 해당 값을 정의하면 됩니다.

SELECT CHOOSE ( 3, 'Manager', 'Director', 'Developer', 'Tester' ) AS Result;

--Developer

3이므로 세 번째에 해당하는 Developer를 반환합니다.

 

CHOOSE 논리 함수에 대한 내용은 아래 링크를 참조하십시오.

http://technet.microsoft.com/ko-kr/library/hh213019(v=sql.110).aspx 

 

l IIF

또 다른 논리함수인 IIF 를 한번 살펴보겠습니다. 사실 IIF CASE 문의 약식 방법입니다. TRUE, FALSE에 따라 처리할 경우 IIF를 사용할 수 있습니다. IIF SQL Server Reporting의 식에서도 사용이 되었기 때문에 사용해보았다면 적용하시는데 큰 문제 없을 것으로 보입니다.

IIF ( boolean_expression, true_value, false_value ) 

boolean_expression TRUE 이면 true_value 가 반환됩니다. 

 

SELECT

[ProductID], [Name], [ListPrice]

, CASE WHEN [ListPrice] < 500 THEN  N'500이하'

           ELSE 

             CASE WHEN [ListPrice] < 1000 THEN N'1000이하' ELSE N'1000이상'
            
 END

           END AS ProceLevel

FROM [Production].[Product]

WHERE [ListPrice] >0

 

500보다 작으면 ‘500이하’, 500보다 크고 1000보다 작으면 ‘1000’이하, 1000보다 크면 ‘1000’이상입니다. IIF로 변환해보겠습니다 

SELECT

[ProductID], [Name], [ListPrice]

, IIF([ListPrice] < 500, N'500이하', IIF([ListPrice] < 1000, N'1000이하',N'1000이상')) AS ProceLevel

FROM [Production].[Product]

WHERE [ListPrice] >0  

/*

522      HL Touring Seat Assembly      196.92  500이하

680      HL Road Frame - Black, 58      1431.50 1000이상

706      HL Road Frame - Red, 58        1431.50 1000이상

707      Sport-100 Helmet, Red 34.99    500이하

708      Sport-100 Helmet, Black          34.99    500이하

*/

 

위 두 구문의 실행계획을 보면 똑같습니다. 편하고 가독성 있는 구문을 쓰면 될 것 같네요~


CASE 문 보다 더 간결한 CHOOSE, IIF 논리함수에 대한 내용을 살펴보았습니다.


댓글