sql >> データベース >  >> RDS >> Sqlserver

複数の行に値を分割する

    次のようなテーブル値分割関数を使用することをお勧めします。

    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;
    

    その後、outer applyを使用できます 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 Fiddle with Demo

    を参照してください

    1. SQLCMDを使用したSQLデータベース保守タスクの実行

    2. SELECTINTOでのORDERBYの保持

    3. ベストプラクティスの多言語Webサイト

    4. PostgreSQLの日付の種類と機能を理解する(例による)