본문 바로가기

프로그래밍/MSSQL

[MSSQL] SPLIT 문자열 구분자로 자르기

반응형

 

 

 

Split 함수 만들기 (문자열을 특정 구분자로 잘라보자)

 

DECLARE @pString VARCHAR(8000) = '120.20.2212.142' -- 문자열
DECLARE @pDelimiter CHAR(1) = '.' -- 구분자
 
;WITH E1(N) AS -- row 10
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), 
E2(N) AS (SELECT 1 FROM E1 a, E1 b), -- row 100
E4(N) AS (SELECT 1 FROM E2 a, E2 b), -- row 10,000
 
cteTally(N) AS -- 문자열 만큼 row
(
    SELECT TOP (ISNULL(DATALENGTH(@pString),0))
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM E4
    -- (ISNULL(DATALENGTH(@pString),0)) = 문자열 개수
    -- ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) = 번호
),
 
cteStart(N1) AS -- 문자열 시작 위치 (구분자 다음)
(
    SELECT 1
    UNION ALL
    SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
    -- 각각의 문자 다음 문자가 구분자와 같은지 체크
    -- 같으면 구분자 다음의 문자(t.N+1)를 가지고 온다.
),
 
cteLen(N1,L1) AS ( -- 문자열 시작 위치와 문자열 크기
 
    SELECT s.N1
        , ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1) ,0) - s.N1,8000)
        -- 구분자 부터 다음 구분자까지 몇개의 문자가 있는지 반환
        -- N1 = 문자열 시작 위치
        -- L1 = (구분자 시작 위치 - 구분자 전 문자열의 시작 위치) = 문자열 크기
 
        /*
            [참고]
            NULLIF(변수,비교값) 변수를 비교값과 비교해서 값이 같으면 NULL을 반환
            CHARINDEX(찾을문자,문자열,시작위치) 문자열에서 찾을문자의 위치를 반환
        */
    FROM cteStart s
)
 
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
       Item       = SUBSTRING(@pString, l.N1, l.L1)
       -- item = 문자열 시작 위치부터 다음 구분자까지의 문자 반환
FROM cteLen l;

 

결과 데이터

 

 

 

반응형