MS-SQL에 SPLIT 함수가 별도 존재하지 않으므로 직접 만들어 사용해야 한다.

 

입력된 문자열의 ':' 기준으로 문자열을 자른다면 아래 쿼리를 통해 구현할 수 있다.

DECLARE @IN_STR VARCHAR(100) = 'SECTION1.SECTION2.SECTION3:1234:2345:6789';

SELECT SUBSTRING(@IN_STR, 1, CHARINDEX(':', @IN_STR) - 1) AS [앞부분]
	, RIGHT(@IN_STR, LEN(@IN_STR) - CHARINDEX(':', @IN_STR)) AS [뒷부분];

 

SUBSTRING : 문자열의 시작 위치부터 일정 영역만큼 잘라내어 반환하다.

CHARINDEX : 문자열에서 특정 문자의 위치를 반환한다.

RIGHT, LEFT : 문자열을 받아서 오른쪽/왼쪽부터 원하는 길이만큼 잘라 반환한다.

 

단순하게 사용시 위 로직으로도 충분하지만, 스플릿할 문자가 여러 개인 경우에 로직이 복잡해질 수 있다.

 

이를 위해 자주 사용하는 함수를 만들어보았다.

CREATE FUNCTION [dbo].[UFN_SPLIT]
(  
	@IN_STR			VARCHAR(MAX),		/* 문자열 */
	@IDX			INT,				/* 추출순번 */
	@SEPARATOR		VARCHAR(10) = ','	/* SPLIT 기준문자 */
)  
RETURNS  VARCHAR(200)   
AS  
BEGIN  

DECLARE @TEMP_STR		VARCHAR(200)  
DECLARE @CUR_STR		VARCHAR(200)  
DECLARE @CUR_SEPARATOR	VARCHAR(10)  
DECLARE @I				INT  
    
SET @TEMP_STR = '';
SET @I = 1;
SET @CUR_SEPARATOR = LTRIM(RTRIM(@SEPARATOR));
SET @CUR_STR  = LTRIM(RTRIM(@IN_STR)) + @CUR_SEPARATOR;  -- 마지막 문자 파싱하기 위해 맨 뒤에 separator 추가

IF CHARINDEX(@CUR_SEPARATOR, @IN_STR) > 0  
    BEGIN  
    WHILE @IDX >= @I
        BEGIN
        IF CHARINDEX(@CUR_SEPARATOR, @CUR_STR) > 0  
            BEGIN  
            -- 문자열 스플릿
            SET @TEMP_STR = SUBSTRING(@CUR_STR, 1, CHARINDEX(@CUR_SEPARATOR, @CUR_STR) - 1);
							
            -- 반환될 문자는 버린후 좌우공백 제거     
            SET @CUR_STR = RIGHT(@CUR_STR, LEN(@CUR_STR) - (LEN(@TEMP_STR) + LEN(@SEPARATOR)));
            END
        ELSE
            BEGIN
            SET @TEMP_STR  = ''
            END
						 
        SET @I = @I + 1  
        END
    END
ELSE
    BEGIN  
        SET @TEMP_STR  = @IN_STR
    END

RETURN(@TEMP_STR)

END
GO

 

 

도전 과제

입력 문자열에 'section1 /section2/section3' 형식으로 사이에 공백이 들어간 경우, 제대로 동작하지 않는다.

로직 중 LEN 함수는 입력된 문자열의 맨 뒤에 입력된 공백을 카운트하지 않기 때문으로 보인다.

 

참고 사항

SQL Server 2016 부터 STRING_SPLIT 함수가 추가되어, 컬럼 문자열의 구분자를 행으로 분리할 수 있게 되었다.

+ Recent posts