Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan CROSS APPLY untuk lebih dari satu kolom

Mungkin lebih mudah untuk menjawab ini jika kami dapat melihat fungsi string terpisah Anda. Jawaban saya menggunakan versi fungsi split yang saya miliki.

Saya akan memasukkan dalam fungsi split Anda nomor baris yang dapat Anda gunakan untuk BERGABUNG dengan string split dan nilai split.

Fungsi pemisahan:

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;

Kemudian jika Anda memiliki beberapa kolom untuk dipisah, Anda dapat menggunakan kueri yang mirip dengan berikut ini:

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;

Lihat SQL Fiddle dengan Demo

Ini menggunakan dua subkueri yang menghasilkan daftar nilai split, kemudian digabungkan menggunakan nomor baris yang dibuat oleh fungsi split.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitungan SQL Server lambat

  2. Ratakan/gabungkan interval waktu yang tumpang tindih

  3. Dapatkan AVG mengabaikan nilai Null atau Zero

  4. Apakah tampilan lebih cepat daripada kueri sederhana?

  5. Beberapa Indeks vs Indeks Multi-Kolom