Maison >base de données >tutoriel mysql >Comment diviser les valeurs délimitées d'une colonne SQL en plusieurs lignes ?

Comment diviser les valeurs délimitées d'une colonne SQL en plusieurs lignes ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-03 18:33:43318parcourir

How to Split Delimited Values in a SQL Column into Multiple Rows?

Diviser les valeurs délimitées d'une colonne SQL en plusieurs lignes

Dans les situations où une colonne SQL contient des données délimitées, il peut être nécessaire d'extraire et formatez les valeurs sur plusieurs lignes. Cette tâche devient particulièrement difficile lorsqu'il s'agit de gros volumes de données ou de chaînes délimitées extrêmement longues.

Considérons l'exemple suivant :

Table source

message-id recipient-address
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected];[email protected];[email protected]

Sortie souhaitée

message-id recipient-address
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]

Pour les versions SQL Server 2016 et versions ultérieures, la fonction STRING_SPLIT fournit une solution simple :

SELECT s.[message-id], f.value
FROM dbo.SourceData AS s
CROSS APPLY STRING_SPLIT(s.[recipient-address], ';') AS f;

Avant SQL Server 2016, une fonction de fractionnement personnalisée peut être créée :

CREATE FUNCTION dbo.SplitStrings
(
    @List NVARCHAR(MAX),
    @Delimiter NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number,
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
        FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ) AS y);
GO

Avec la fonction de fractionnement en place , les données peuvent être extraites et formatées :

SELECT s.[message-id], f.Item
FROM dbo.SourceData AS s
CROSS APPLY dbo.SplitStrings(s.[recipient-address], ';') AS f;

En tirant parti de ces techniques, il est possible de diviser efficacement valeurs délimitées en plusieurs lignes, simplifiant les tâches de formatage et d'analyse des données.

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!

Déclaration:
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