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

複数の列に CROSS APPLY を使用する

    分割文字列関数を確認できれば、これに答えるのが簡単になるかもしれません。私の答えは、私が持っている分割関数のバージョンを使用することです.

    分割文字列と分割値を結合するために使用できる行番号を分割関数に含めます。

    分割機能:

    CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
    returns @temptable TABLE (items varchar(MAX), rn int)       
    as       
    begin      
        declare @idx int       
        declare @slice varchar(8000)   
        declare @rn int = 1 -- row number that increments with each value in the delimited string
    
        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, rn) values(@slice, @rn)       
    
            set @String = right(@String,len(@String) - @idx)       
            set @rn = @rn +1
    
            if len(@String) = 0 break       
        end   
    return 
    end;
    

    分割する列が複数ある場合は、次のようなクエリを使用できます:

    INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
    select s.rawkey,
      s.splitstring,
      v.splitvalues
    from
    (
      SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
        c.items SplitString, 
        c.rn
      FROM dbo.tblRawData d
      CROSS APPLY dbo.Split(d.DelimitedString, ',') c
    ) s
    inner join
    (
      SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
        c.items SplitValues, 
        c.rn
      FROM dbo.tblRawData d
      CROSS APPLY dbo.Split(d.DelimitedValues, ',') c
    ) v
      on s.rawkey = v.rawkey
      and s.delimitedstring = v.delimitedstring
      and s.rn = v.rn;
    

    デモによる SQL Fiddle を参照してください。

    これは、分割値のリストを生成する 2 つのサブクエリを使用し、分割関数によって作成された行番号を使用してそれらを結合します。



    1. 年および月ごとのPHPMYSQLブログアーカイブメニュー

    2. Oracleの動的DESCおよびASCの順序

    3. ストアドプロシージャの依存関係をプログラムでどのように識別しますか?

    4. OracleDBでビューを作成中にエラーが発生する