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

 

읽어주셔서 감사합니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기