복붙노트

[SQL] SQL 서버에서 문자열을 분할

SQL

SQL 서버에서 문자열을 분할

나는 쉼표 separated.Like입니다 데이터베이스에서 문자열을 '사과, 바나나, 파인애플, 포도' 나는 어떤 SQL 서버의 함수가 내장되어 this.Since 통해 쉼표와 반복 처리에 근거하여이 문자열을 분할해야,이 목표를 달성 할 수있는 어떤 효율적인 방법이 있습니까.

해결법

  1. ==============================

    1.이 기능을 사용해보십시오

    이 기능을 사용해보십시오

    CREATE FUNCTION [dbo].[func_Split] 
        (   
        @DelimitedString    varchar(8000),
        @Delimiter              varchar(100) 
        )
    RETURNS @tblArray TABLE
        (
        ElementID   int IDENTITY(1,1),  -- Array index
        Element     varchar(1000)               -- Array element contents
        )
    AS
    BEGIN
    
        -- Local Variable Declarations
        -- ---------------------------
        DECLARE @Index      smallint,
                        @Start      smallint,
                        @DelSize    smallint
    
        SET @DelSize = LEN(@Delimiter)
    
        -- Loop through source string and add elements to destination table array
        -- ----------------------------------------------------------------------
        WHILE LEN(@DelimitedString) > 0
        BEGIN
    
            SET @Index = CHARINDEX(@Delimiter, @DelimitedString)
    
            IF @Index = 0
                BEGIN
    
                    INSERT INTO
                        @tblArray 
                        (Element)
                    VALUES
                        (LTRIM(RTRIM(@DelimitedString)))
    
                    BREAK
                END
            ELSE
                BEGIN
    
                    INSERT INTO
                        @tblArray 
                        (Element)
                    VALUES
                        (LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1,@Index - 1))))
    
                    SET @Start = @Index + @DelSize
                    SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1)
    
                END
        END
    
        RETURN
    END
    

    예 사용 - 단순히 기능을 쉼표로 구분 된 문자열뿐 아니라 필요한 구분 기호를 전달합니다.

    DECLARE @SQLStr varchar(100)
    SELECT @SQLStr = 'Mickey Mouse, Goofy, Donald Duck, Pluto, Minnie Mouse'
    
    SELECT
        *
    FROM
        dbo.func_split(@SQLStr, ',')
    

    결과는 다음과 같이 될 것입니다

  2. ==============================

    2.즉,이 질문하지만, SQL 서버 2016를 소개 STRING_SPLIT 요청시 사실이었다.

    즉,이 질문하지만, SQL 서버 2016를 소개 STRING_SPLIT 요청시 사실이었다.

    당신은 그냥 사용할 수 있도록

    SELECT value
    FROM   STRING_SPLIT ('apple,banana,pineapple,grapes', ',') 
    

    몇 가지 제한 (단 하나의 문자 받아 구분 잡는 가장 눈되는 분할 인덱스를 나타내는 모든 열의 부족)이 있습니다. 다양한 제한 및 성능 테스트의 일부 유망한 결과는 아론 베르이 블로그 게시물에 있습니다.

  3. ==============================

    3.당신은 단어를 ,이 경우, 사용자 정의 태그에 의해 쉼표를 대체하여, XML로 데이터를 변환 할 수 있습니다.

    당신은 단어를 ,이 경우, 사용자 정의 태그에 의해 쉼표를 대체하여, XML로 데이터를 변환 할 수 있습니다.

    create table t(col varchar(255));
    insert into t values ('apple,banana,pineapple,grapes');
    insert into t values ('car,bike,airplane');
    
    select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
      from t
    

    어느 반환

    |                                               XMLVALUE |
    |--------------------------------------------------------|
    | <w>apple</w><w>banana</w><w>pineapple</w><w>grapes</w> |
    |                   <w>car</w><w>bike</w><w>airplane</w> |
    

    당신이 내부 XML을 선택할 때이 쿼리를 사용하는 경우 이제, 외부 쿼리는 별개의 행으로 분할 할 수 있습니다 :

    해결책:

    select split.xmlTable.value('.', 'varchar(255)') as xmlValue
    from (
    
       select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
         from t
    
    ) as xmlTable
    cross apply xmlValue.nodes ('/w') as split(xmlTable);
    

    라이브 sqlFiddle

  4. ==============================

    4.다음과 같이 내가 재귀를 사용하여 솔루션을

    다음과 같이 내가 재귀를 사용하여 솔루션을

    Create function split_string(@str as nvarchar(max),@separator as char(1)) returns @myvalues Table (id int identity(1,1),myval nvarchar(100))
    as 
    --Kamel Gazzah
    --23/04/2019
    begin
    with cte as(
    select @str [mystr],
    cast(1 as int) [Start],
    charindex(@separator,@str)as Nd
    union all
    select substring(@str,nd+1,len(@str)),cast(Nd+1 as int),charindex(@separator,@str,Nd+1) from cte
    where nd>0
    )
    insert into @myvalues(myval) 
    select case when nd>0 then substring(@str,start,Nd-start) 
    else substring(@str,start,len(@str)) end [splitted] 
    from cte   OPTION (MAXRECURSION 1000);
    return ;
    end;
    

    이 함수를 호출 할 수 있습니다

    select * from split_string('apple,banana,pineapple,grapes',',')
    
  5. from https://stackoverflow.com/questions/21428612/splitting-the-string-in-sql-server by cc-by-sa and MIT license