sql >> Database >  >> RDS >> Sqlserver

SQL-query om kolomgegevens in rijen te splitsen

Voor dit type gegevensscheiding raad ik aan om een ​​splitfunctie te maken:

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;

Om dit vervolgens in een query te gebruiken, kunt u een outer apply . gebruiken om deel te nemen aan uw bestaande tafel:

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

Wat het resultaat oplevert:

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

Zie SQL Fiddle met demo

Of u kunt een CTE-versie implementeren die lijkt op deze:

;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. Een Java-toepassing maken in Oracle JDeveloper, deel 1

  2. SQL Kiezen uit twee tabellen met inner join en limit

  3. Geef de besturing door aan een specifieke regel met de opdracht Goto Label in PLSQL

  4. Deadlocks in PostgreSQL bij het uitvoeren van UPDATE