Maison > base de données > tutoriel mysql > Comment transformer les valeurs séparées par des virgules dans une colonne SQL en lignes séparées ?

Comment transformer les valeurs séparées par des virgules dans une colonne SQL en lignes séparées ?

Mary-Kate Olsen
Libérer: 2025-01-05 10:06:45
original
1003 Les gens l'ont consulté

How to Transform Comma-Separated Values in a SQL Column into Separate Rows?

Requête SQL pour diviser les données de colonne en lignes

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;
Copier après la connexion

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
Copier après la connexion

Cette requête produira le résultat souhaité :

| CODE |  DECLARATION |
-----------------------
|  123 |     a1-2 nos |
|  123 |  a2- 230 nos |
|  123 |    a3 - 5nos |
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal