SQL Server 2012 T-SQL: CHOOSE, IIF 논리함수
새롭게 제공되는 내용 중에서 CHOOSE, IIF를 한번 사용해보도록 하겠습니다.
SELECT 구문에서 조건에 따라 값을 나타내려고 할 경우 CASE WHEN 문을 사용해서 처리했습니다. CASE 구문을 작성하면 코드가 길어지고 가독성이 좀 떨어지는 측면이 있었습니다.
CHOOSE
SQL Server 2012에서는 보다 더 간결하고 쉽게 처리 가능한 CHOOSE, IIF 구문이 제공됩니다.
아래 구문을 한번 살펴보시죠~
1 2 3 4 5 6 7 8 9 | 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 | cs |
참고로
SELECT DATENAME (WEEKDAY, '20130730') -- 화요일
SELECT DATEPART (WEEKDAY, '20130730') -- 3
이다.
위 구문의 경우는 CASE WHEN 구문으로 작성한 내용인데 CHOOSE 구문으로 변경해보도록 하겠습니다. 더 간결해보입니다.
1 | SELECT CHOOSE(DATEPART(WEEKDAY, GETDATE()) , N'일요일',N'월요일',N'화요일',N'수요일',N'목요일',N'금요일',N'토요일') | cs |
CHOOSE 논리함수의 구문의 규칙은 아래와 같습니다.
CHOOSE ( index, val_1, val_2 [, val_n ] )
Index 는 1부터 시작하는 정수이며 val_1.., 등은 인덱스에 매치되는 임의의 데이터 형식입니다.
그러므로 1부터 반환하는 정수가 나오는 인수를 맨 처음에, 나머지는 해당 값을 정의하면 됩니다.
1 | SELECT CHOOSE ( 3, 'Manager', 'Director', 'Developer', 'Tester' ) AS Result; | cs |
--Developer
3이므로 세 번째에 해당하는 Developer를 반환합니다.
CHOOSE 논리 함수에 대한 내용은 아래 링크를 참조하십시오.
http://technet.microsoft.com/ko-kr/library/hh213019(v=sql.110).aspx
IIF
또 다른 논리함수인 IIF 를 한번 살펴보겠습니다. 사실 IIF는 CASE 문의 약식 방법입니다. TRUE, FALSE에 따라 처리할 경우 IIF를 사용할 수 있습니다. IIF 는 SQL Server Reporting의 식에서도 사용이 되었기 때문에 사용해보았다면 적용하시는데 큰 문제 없을 것으로 보입니다.
IIF ( boolean_expression, true_value, false_value )
boolean_expression 이 TRUE 이면 true_value 가 반환됩니다.
1 2 3 4 5 6 7 8 9 | 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 | cs |
500보다 작으면 ‘500이하’, 500보다 크고 1000보다 작으면 ‘1000’이하, 1000보다 크면 ‘1000’이상입니다. IIF로 변환해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | 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이하 */ | cs |
위 두 구문의 실행계획을 보면 똑같습니다. 편하고 가독성 있는 구문을 쓰면 될 것 같네요~
CASE 문 보다 더 간결한 CHOOSE, IIF 논리함수에 대한 내용을 살펴보았습니다.
출처: http://redju.tistory.com/142 [redJu(홍주)]
'SQL > MS-SQL' 카테고리의 다른 글
커서(Cursor) (0) | 2017.09.06 |
---|---|
UNION ALL로 소계, 합계 구하기 (0) | 2017.09.05 |
특정경우를 만족하는 행 SELECT (0) | 2017.09.04 |
FOR XML (0) | 2017.09.04 |
WINDOW FUNCTION (0) | 2017.09.04 |