복붙노트

[SQL] 여러 행에 걸쳐 분할 값 [중복]

SQL

여러 행에 걸쳐 분할 값 [중복]

내가 저장 프로 시저에서 다음과 같은 출력이 여러 행으로 값을 분리하는 가장 좋은 방법을 궁금 해서요.

reference   name                            subjects       subjectstitle
LL9X81MT    Making and Decorating Pottery   F06,F27,F38       NULL

나는 쉼표의에서 주제 필드를 손질하고 데이터가 다음과 같은 것 때문에 세 행을 통해 정보를 복제 할 필요가있다.

reference   name                            subjects       subjectstitle
LL9X81MT    Making and Decorating Pottery   F06       NULL
LL9X81MT    Making and Decorating Pottery   F27       NULL
LL9X81MT    Making and Decorating Pottery   F38       NULL

나는 설정이 SP의를에 MS SQL 서버 2008을 사용하고 그냥 주제가 필드 분할하는 방법에 대한 몇 가지 도움이 필요 해요.

감사,

해결법

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

    1.이 유사 테이블 반환 분할 기능의 일종을 사용하기를 원할 것입니다 :

    이 유사 테이블 반환 분할 기능의 일종을 사용하기를 원할 것입니다 :

    create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
    returns @temptable TABLE (items varchar(MAX))       
    as       
    begin      
        declare @idx int       
        declare @slice varchar(8000)       
    
        select @idx = 1       
            if len(@String)<1 or @String is null  return       
    
        while @idx!= 0       
        begin       
            set @idx = charindex(@Delimiter,@String)       
            if @idx!=0       
                set @slice = left(@String,@idx - 1)       
            else       
                set @slice = @String       
    
            if(len(@slice)>0)  
                insert into @temptable(Items) values(@slice)       
    
            set @String = right(@String,len(@String) - @idx)       
            if len(@String) = 0 break       
        end   
    return 
    end;
    

    그런 다음 사용하는 외부 yourtable로 가입 신청을 할 수 있습니다 :

    select t1.reference,
      t1.name,
      t1.subjectstitle,
      i.items subjects
    from yourtable t1
    outer apply dbo.split(t1.subjects, ',') i
    

    이 같은 결과를주기 :

    | REFERENCE |                          NAME | SUBJECTSTITLE | SUBJECTS |
    ------------------------------------------------------------------------
    |  LL9X81MT | Making and Decorating Pottery |        (null) |      F06 |
    |  LL9X81MT | Making and Decorating Pottery |        (null) |      F27 |
    |  LL9X81MT | Making and Decorating Pottery |        (null) |      F38 |
    

    데모와 SQL 바이올린을 참조하십시오

    당신이 분할 기능이없는이 작업을 수행하려면, 당신은 CTE를 사용할 수 있습니다 :

    ;with cte (reference, name, subjectstitle, subjectitem, subjects) as
    (
      select reference,
        name,
        subjectstitle,
        cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) subjectitem,
             stuff(subjects, 1, charindex(',',subjects+','), '') subjects
      from yourtable
      union all
      select reference,
        name,
        subjectstitle,
        cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) ,
        stuff(subjects, 1, charindex(',',subjects+','), '') subjects
      from cte
      where subjects > ''
    ) 
    select reference, name, subjectstitle, subjectitem
    from cte
    

    데모와 SQL 바이올린을 참조하십시오

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

    2.이것은 분할 기능이없는 할 것

    이것은 분할 기능이없는 할 것

    SELECT T1.reference, T1.name, T2.my_Splits AS subjects, T1.subtitile
    FROM
     (
      SELECT *,
      CAST('<X>'+replace(T.subjects,',','</X><X>')+'</X>' as XML) as my_Xml 
      FROM [yourTable] T
     ) T1
     CROSS APPLY
     ( 
     SELECT my_Data.D.value('.','varchar(50)') as my_Splits
     FROM T1.my_Xml.nodes('X') as my_Data(D)
     ) T2
    
  3. from https://stackoverflow.com/questions/13159526/split-values-over-multiple-rows by cc-by-sa and MIT license