반응형

/*
-- Title : [SQL2016] String_Split w/Sequence
-- Reference : 
-- Tag : string_split 문자열 구분자 시퀀스 순서

*/


■ 구분자로 구성된 문자열 분리할 때 Index 생성 함수(NULL 유무 포함)

CREATE FUNCTION [dbo].[fn_string_split_idx]
( @String nvarchar(max), @Separator nvarchar(10), @null_yn bit)
RETURNS TABLE 
/*
     select * from dbo.fn_string_split_idx('e,f,g,,e,e', ',', 0);
     select * from dbo.fn_string_split_idx('e,f,g,,e,e', ',', 1);
*/
AS
RETURN 
(
     SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS "Idx", value AS sValue
     FROM STRING_SPLIT(@String, @Separator)
     WHERE 1 = 1
     and value <> (CASE WHEN @null_yn = 1 THEN '' ELSE '!@#$%안나올만한거^&*()' END)
)

■ 구분자로 구성된 문자열 분리할 때 Index 생성 함수(NULL 유무, Distinct 여부 포함)

CREATE FUNCTION dbo.fn_string_split_seq
(@string nvarchar(max), @Separator NVARCHAR(10), @null_yn BIT, @distinct_yn BIT)
RETURNS @rslt TABLE (
Seq INT NULL,
sValue NVARCHAR(max) NULL
)
/*
     select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 0, 0);
     select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 1, 0);
     select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 1, 1);
*/
AS 
BEGIN
    DECLARE @temp TABLE
    (
        Seq INT IDENTITY(1,1)
      , sValue NVARCHAR(MAX)
    )
    
    INSERT INTO @temp
    SELECT value
    FROM string_split(@string, @Separator)
    
    IF( @null_yn = 1 )
    BEGIN
        DELETE
        FROM @temp
        WHERE sValue = ''
    END

    IF( @distinct_yn = 1 )
    BEGIN
        INSERT INTO @rslt
        SELECT ROW_NUMBER() OVER ( ORDER BY Seq) Seq
             , sValue
        FROM
        (
            SELECT MIN(Seq) Seq, sValue
            FROM @temp
            GROUP BY sValue
        ) a

        RETURN
    END
    ELSE 

    INSERT INTO @rslt
    SELECT ROW_NUMBER() OVER ( ORDER BY Seq) Seq
         , sValue
    FROM @temp

    RETURN

END


■ 제공 버전

Azure SQL Server에서는 제공되나 SQL Server 2017에서는 지원되지 않는 것 확인

 

반응형

+ Recent posts