[MSSQL] CHARINDEX를 이용한 문자열 SPLIT

2013. 12. 3. 21:01Coders

CHARINDEX 함수를 이용하여, 문자열을 쪼개어 테이블에 넣어 리턴하는 테이블리턴함수 입니다.

여러 번 작성했었는데, 간만에 그냥 테스트 해 보며 머릿속에서 나오는 대로 코딩해 보았습니다.

넘겨지는 원문은 긴 데이터도 받아들일 수 있도록 NTEXT를 받을 수 있게 구현 되어 있습니다.

해당 테이블 리턴 함수를 이용하여 alias를 주고, 다른 테이블과 JOIN 하며 처리하면 활용도가 높겠죠. ㅎ


NTEXT 데이터 타입도,

SUBSTRINGCHARINDEX 라는 훌륭한 문자열 함수를 적용시킬 수 있다는 좋은 예제라고 생각 됩니다.


CREATE FUNCTION TF_SPLIT
(
    @ORG_STR  NTEXT,        -- 쪼갤 원문
    @SPLITTER NVARCHAR(1)   -- 쪼갤 문자열
)
RETURNS @TBL_SPLIT TABLE
(
    VAL NVARCHAR(4000)      -- 쪼갠 데이터가 들어갈 테이블(길이 확인)
)
AS
BEGIN

    -- 원문이 빈 문자열이면 그대로 리턴
    IF ISNULL(DATALENGTH(@ORG_STR), 0) = 0
        GOTO FUNC_RET;

    -- 변수 선언
    DECLARE @START INT,
            @FOUND INT;

    -- 변수 초기화   
    SET @START = 1; 
    SET @FOUND = CHARINDEX(@SPLITTER, @ORG_STR, @START + 1);

    -- @SPLITTER 가 존재하는 경우에만 LOOP
    WHILE @FOUND > @START
    BEGIN
        -- @SPLITTER 로 쪼갠 문자열을 리턴 테이블에 INSERT
        INSERT INTO @TBL_SPLIT ( VAL )
        VALUES ( SUBSTRING(@ORG_STR, @START, @FOUND - @START) );

        -- 다음 @SPLITTER 찾음
        SET @START = @FOUND + 1;
        SET @FOUND = CHARINDEX(@SPLITTER, @ORG_STR, @START);
    END;

FUNC_RET:    
    RETURN;
END
GO

-- 테스트
SELECT * FROM TF_SPLIT ( N'김구라&윤종신&김국진&규현&', N'&' );
GO

결과


'Coders' 카테고리의 다른 글

[C#] Splash Window 띄우기  (0) 2013.12.27
[C++] Linked List 예제  (0) 2013.11.20
[C#] Get 방식으로 웹 페이지 읽기.  (0) 2013.11.19