sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af CROSS APPLY for mere end én kolonne

Det kunne være nemmere at svare på dette, hvis vi kunne se din split-string-funktion. Mit svar er at bruge en version af min split-funktion, som jeg har.

Jeg ville inkludere et rækkenummer i din split-funktion, som du kan bruge til at JOIN den split-streng og split-værdierne.

Split funktion:

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;

Hvis du så har flere kolonner at opdele, kan du bruge en forespørgsel, der ligner følgende:

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;

Se SQL Fiddle with Demo

Dette bruger to underforespørgsler, der genererer listen over opdelte værdier, hvorefter de sammenføjes ved hjælp af rækkenummeret, der er oprettet af splitfunktionen.



  1. MySQL behandler jeg ikke som jeg?

  2. Hvordan TILDELER JEG ALLE PRIVILEGIER på ALLE VISNINGER i én erklæring?

  3. Datakvalitet og uklar søgning

  4. java.lang.IllegalArgumentException:kolonne '_id' findes ikke