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

列データを行に分割するSQLクエリ

    このタイプのデータ分離では、分割関数を作成することをお勧めします:

    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を使用できます。 既存のテーブルに参加するには:

    select t1.code, s.items declaration
    from yourtable t1
    outer apply dbo.split(t1.declaration, ',') s
    

    結果は次のようになります:

    | CODE |  DECLARATION |
    -----------------------
    |  123 |     a1-2 nos |
    |  123 |  a2- 230 nos |
    |  123 |    a3 - 5nos |
    

    SQL Fiddle with Demo

    を参照してください

    または、次のようなCTEバージョンを実装できます:

    ;with cte (code, DeclarationItem, Declaration) as
    (
      select Code,
        cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem,
             stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration
      from yourtable
      union all
      select code,
        cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem,
        stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration
      from cte
      where Declaration > ''
    ) 
    select code, DeclarationItem
    from cte
    


    1. 削除後にSQLServerで自動インクリメントをリセットする

    2. MySQLTABLEステートメント

    3. SQL Server(T-SQL)の特定のパーティションからすべての行を返す

    4. Oracleのピボットテーブルを使用したアドバイス