STRING_SPLIT 함수는 문자열을 구분자로 구분하여 테이블 형식으로 반환해주는 기능을 하고 있습니다.
제약사항으로 구분자 매개변수는 NCHAR(1), NVARCHAR(1), CHAR(1), VARCHAR(1)만 지원합니다.
SQL Server 2016 버전 이상부터 사용 가능하며, 이전 버전의 경우 사용자 정의 함수를 구성하면 됩니다.
CROSS APPLY, OUTER APPLY를 활용하면 다양한 응용이 가능합니다.
[예제]
DROP TABLE #BookOrder
-- 책 구매내역 결과
CREATE TABLE #BookOrder
(
Customer NVARCHAR(50)
,RESULT NVARCHAR(500)
)
INSERT INTO #BookOrder (Customer, RESULT)
SELECT '김길동', '20220101|코난1|명탐정코난2|명탐정코난3' UNION ALL
SELECT '고길동', '20220105|토익리딩|토익리스닝' UNION ALL
SELECT '홍길동', '20220107|기출문제1|기출문제2|기출문제3'
-- SQL Server 2016 버전 이상
SELECT VALUE FROM STRING_SPLIT ('20220101|코난1|명탐정코난2|명탐정코난3', '|')
-- CROSS APPLY 연계
SELECT ROW_NUMBER()OVER(PARTITION BY A.Customer ORDER BY A.Customer) AS NO, A.Customer, VALUE
FROM #BookOrder AS A
CROSS APPLY STRING_SPLIT (A.RESULT, '|')
-- SQL Server 2016 버전 이하
SELECT VALUE FROM STRING_SPLIT ('20220101|명탐정코난1|명탐정코난2|명탐정코난3', '|')
-- CROSS APPLY 연계
SELECT A.CUSTOMER, B.*
FROM #BookOrder AS A
CROSS APPLY _FCOMSplit (A.RESULT, '|') AS B
[사용자 정의 함수 예제]
CREATE FUNCTION dbo.FnStrSplit
(
@sText NVARCHAR(MAX),
@sDelim VARCHAR(20) ='.'
)
RETURNS @retArray
TABLE
(
idx smallint Primary Key,
value NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @idx smallint,
@value NVARCHAR(MAX),
@bcontinue bit,
@iStrike smallint,
@iDelimlength tinyint
SET @idx = 1
SET @sText = LTrim(RTrim(@sText))
SET @iDelimlength = LEN(@sDelim)
SET @bcontinue = 1
WHILE @bcontinue = 1
BEGIN
--텍스트에서 구분자를 발견하면, 첫 번째 요소를 반환하고 인덱스 입력한다.
IF CHARINDEX(@sDelim, @sText)>0
BEGIN
-- 첫 번째 요소를 반환
SET @value = SUBSTRING(@sText,1, CHARINDEX(@sDelim,@sText)-1)
INSERT @retArray (idx, value) VALUES (@idx, @value)
--다음 요소와 구분자를 문자열의 앞에서부터 제거하고,
--index를 증가시키고 반복작업(loop)을 이어간다.
SET @iStrike = LEN(@value) + @iDelimlength
SET @idx = @idx + 1
SET @sText = LTrim(Right(@sText,LEN(@sText) - @iStrike))
END
ELSE
BEGIN
--만약 텍스트 안에서 구분자를 더 이상 찾을 수 없게 되면,
--@sText가 @retArray의 마지막 값이다.
SET @value = @sText
-- 마지막 값도 구분자로 나누어져 있으뎐
INSERT @retArray (idx, value) VALUES (@idx, @value)
--WHILE 루프를 빠져 나온다.
SET @bcontinue = 0
END
END
RETURN
END
읽어주셔서 감사합니다.
반응형
최근댓글