Problème :
Vous avez une table avec deux colonnes, Code et Déclaration. La colonne Déclaration contient une liste de valeurs séparées par des virgules. Vous devez convertir ces données en lignes, chaque ligne représentant une déclaration distincte pour le code correspondant.
Solution :
Une approche pour résoudre ce problème consiste à créer un fonction SQL personnalisée :
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;
Vous pouvez ensuite exploiter cette fonction dans une requête à l'aide d'une application externe pour vous connecter à votre existant table :
select t1.code, s.items declaration from yourtable t1 outer apply dbo.split(t1.declaration, ',') s
Cette requête produira le résultat souhaité :
| CODE | DECLARATION | ----------------------- | 123 | a1-2 nos | | 123 | a2- 230 nos | | 123 | a3 - 5nos |
Alternativement, vous pouvez utiliser une version CTE (Common Table Expression), qui fonctionne de la même manière :
;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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!