소개
T-SQL 관련 일부 함수가 확장되고 새로운 함수와 구문이 추가되었습니다.
Transact-SQL 확장 또는 새로운 함수들
TRIM ( [ LEADING | TRAILING | BOTH ] [characters FROM ] string )
LTRIM ( character_expression , [ characters ] ) / RTRIM ( character_expression , [ characters ] )
기본 함수는 문자열에서 공백 문자를 제거했습니다. SQL Server 2022에서는 제거할 특정 문자를 지정하고 대상 위치를 시작(LEADING), 끝(TRAILING), 양쪽(BOTH) 으로 지정할 수 있습니다. 더불어 LTRIM(), RTRIM()도 유사한 기능으로 characters 옵션이 추가되었습니다.
[예제] 간단한 예제코드입니다.
SELECT RTRIM('.123abc.' , '.');
SELECT LTRIM('.123abc.' , '.123');
SELECT TRIM( '.,! ' FROM ' # test .') AS Result;
SELECT TRIM( BOTH '.,! ' FROM ' # test .') AS Result;
SELECT TRIM(BOTH '123' FROM '123a1b2c123') AS Result;
SELECT TRIM(LEADING '.,! ' FROM ' .# test .') AS Result;
SELECT TRIM(TRAILING '.,! ' FROM ' .# test .') AS Result;
select CHAR(20)
select RTRIM('321321'+char(20),CHAR(20))
<div>
DATETRUNC ( datepart, date )
date에서 datepart로 지정한 부분까지 자르고 나머지 부분은 초기값으로 설정해 반환합니다.
[예제] 간단한 예제코드입니다.
</div>
DECLARE @d datetime2 = '2021-12-08 11:30:15.1234567';
SELECT '원본', @d;
SELECT 'Year', DATETRUNC(year, @d);
SELECT 'Quarter', DATETRUNC(quarter, @d);
SELECT 'Month', DATETRUNC(month, @d);
SELECT 'Week', DATETRUNC(week, @d); — Using the default DATEFIRST setting the value of 7 (U.S. English)
SELECT 'Iso_week', DATETRUNC(iso_week, @d);
SELECT 'DayOfYear', DATETRUNC(dayofyear, @d); — day와 동일
SELECT 'Day', DATETRUNC(day, @d);
SELECT 'Hour', DATETRUNC(hour, @d);
SELECT 'Minute', DATETRUNC(minute, @d);
SELECT 'Second', DATETRUNC(second, @d);
SELECT 'Millisecond', DATETRUNC(millisecond, @d);
SELECT 'Microsecond', DATETRUNC(microsecond, @d);
expression IS [NOT] DISTINCT FROM expression
두 expression이 동일하면 true 아니면 false를 반환합니다 그런데 NULL 비교에도 기존 unknown이 아닌 true/false를 반환하므로 특별한 경우에 유용하게 활용할 수 있습니다.
WHERE, HAVING, FROM ON 절의 조건자로 사용할 수 있습니다.
[예제] 간단한 예제코드입니다.
USE tempdb;
GO
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO
— 1) 17과 다른지 않은 것? (= 같은 거)
SELECT * FROM #SampleTempTable WHERE id = 17;
— 2) NUL과 같은 거
SELECT * FROM #SampleTempTable WHERE id = NULL;
— 3) NULL과 다른 거
SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM 17;
SELECT * FROM #SampleTempTable WHERE id <> 17;
BIT 조작 함수
LEFT_SHIFT ( expression_value, shift_amount ) expression_value << shift_amount RIGHT_SHIFT ( expression_value, shift_amount ) expression_value >> shift_amount GET_BIT ( expression_value, bit_offset ) SET_BIT ( expression_value, bit_offset ) SET_BIT ( expression_value, bit_offset, bit_value ) BIT_COUNT ( expression_value )
expression_value에지정한 정수 또는 이진 값(binary) 내에서 단일 비트를 이동, 검색, 설정, 계산할 수 있습니다.
[예제] 간단한 예제코드입니다.
— 0001(1), 0010(2), 0100(4), 1000(8)
— LEFT_SHIFT
SELECT LEFT_SHIFT(1, 1);
SELECT 2 << 1;
SELECT 4 << 1;
SELECT 8 << 1;
SELECT 2 << 2;
SELECT RIGHT_SHIFT(2, 1);
SELECT 4 >> 1;
SELECT 8 >> 1;
SELECT 16 >> 2;
SELECT — 0110
GET_BIT( 0x06, 0 ) as Get_1nd_Bit,
GET_BIT( 0x06, 1 ) as Get_2nd_Bit,
GET_BIT( 0x06, 2 ) as Get_3nd_Bit,
GET_BIT( 0x06, 3 ) as Get_4nd_Bit
SELECT
SET_BIT(0x0000, 0) as VARBIN1,
SET_BIT(0x0000, 1) as VARBIN2,
SET_BIT(0x0000, 2) as VARBIN3,
SET_BIT(0x0000, 3) as VARBIN4
— 0001 0111
SELECT BIT_COUNT(0x17) as BitCnt;
SELECT BIT_COUNT(23) as BitCnt;
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
SQL Server 2022에 세 번째 인수 enable_ordinal이 추가되었습니다. 이를 1로 지정하면 순번을 출력하는 ordinal 열이 결과에 포함됩니다. 이 열을 가지고 원하는 순서로 정렬하거나 기타 추가 작업에 응용할 수 있습니다.
[예제] 간단한 예제코드입니다.
— 좌우 공백에 주의
SELECT *
FROM STRING_SPLIT('10250,10248,10249', ',');
SELECT *
FROM STRING_SPLIT('10250,10248,10249', ',', 1);
SELECT *
FROM STRING_SPLIT('10250,10248,10249', ',', 1)
ORDER BY ordinal DESC;
GREATEST ( expression1 [ , …expressionN ] ), LEAST ( expression1 [ , …expressionN ] )
하나 이상의 expression1 중에서 최댓값 또는 최솟값을 반환합니다. 기존에 조금 번거롭게 구현하던 작업을 쉽게 처리할 수 있게 되었습니다.
[예제] 간단한 예제코드입니다.
SELECT
GREATEST(10250, 10248, 11077)
, LEAST(10250, 10248, 11077);
WINDOW window_name AS (
[ reference_window_name ]
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
WINDOW 함수, 집계함수 등의 OVER절에서 정의하던 WINDOW 부분(PARTITION or ORDER or FRAME)을 별도로 정의하고 그 별칭(window_name)을 사용해서 구문을 간단하게 작성할 수 있습니다.
[예제] 간단한 예제코드입니다.
/*
이전
*/
SELECT SUM(d.OrderQty) OVER(PARTITION BY d.SalesOrderID) AS QtySum
FROM AdventureWorks.Sales.SalesOrderDetail AS d
/*
이후
*/
SELECT SUM(d.OrderQty) OVER SalesID AS QtySum
FROM AdventureWorks.Sales.SalesOrderDetail AS d
WINDOW SalesID AS (PARTITION BY SalesOrderID)
정리
유용한 함수들이 여럿 보이죠? 이전보다 더 편하게 활용할 수 있기를 기대합니다.
모두 건강하세요.
김정선 드림