DB

[MSSQL] 일부 컬럼을 분리해서 JOIN - CROSS APPLY

쑤기c 2018. 3. 27. 16:51

--일부 컬럼을 분리해서 JOIN - CROSS APPLY
SELECT A.ModelID, E.VALUE AS EquipmentID
  FROM  dbo.MODEL_INFO A WITH(NOLOCK)
	    CROSS APPLY dbo.SP_SPLIT(A.EquipmentID, ',') E
            LEFT OUTER JOIN MODEL_HISTORY B WITH(NOLOCK) ON  A.ModelID = B.ModelID AND B.Apply = 1
WHERE B.ModelID IS NOT NULL

-- SP_SPLIT(str,seperator) 는 구분자로 분리해서 테이블을 반환하는 함수
CREATE FUNCTION dbo.SP_SPLIT
(
    @StrValue VARCHAR(6000),   -- 분리할 문자열
    @SplitChar VARCHAR(1)         -- 구분할 문자
) 
RETURNS @SPLIT_TEMP TABLE  ( VALUE VARCHAR(1000) )
AS 
BEGIN   
    DECLARE @oPos INT, @nPos INT
    DECLARE @TmpVar VARCHAR(1000) -- 분리된 문자열 임시 저장변수

    SET @oPos = 1 -- 구분문자 검색을 시작할 위치
    SET @nPos = 1 -- 구분문자 위치

    WHILE (@nPos > 0)
    BEGIN 
        SET @nPos = CHARINDEX(@SplitChar, @StrValue, @oPos ) 

        IF @nPos = 0 
            SET @TmpVar = RIGHT(@StrValue, LEN(@StrValue)-@oPos+1 )
        ELSE
            SET @TmpVar = SUBSTRING(@StrValue, @oPos, @nPos-@oPos)

        IF LEN(@TmpVar)>0
            INSERT INTO @SPLIT_TEMP VALUES( @TmpVar )

        SET @oPos = @nPos +1 
    END 
END


MODEL_INFO.EquipmentID    'eqpid_01,eqpid_02' 라는 데이터에 대해서

결과물을 2 row 로 분리해야할때 사용.




반응형