Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memisahkan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris?

Bagaimana untuk Memisahkan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris?

Patricia Arquette
Patricia Arquetteasal
2025-01-03 18:33:43317semak imbas

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

Memisahkan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris

Dalam situasi di mana lajur SQL mengandungi data terhad, mungkin perlu mengekstrak dan formatkan nilai ke dalam berbilang baris. Tugas ini menjadi sangat mencabar apabila berurusan dengan volum data yang besar atau rentetan terhad yang sangat panjang.

Pertimbangkan contoh berikut:

Jadual Sumber

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

Output yang Diingini

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

Untuk SQL Server versi 2016 dan ke atas, fungsi STRING_SPLIT menyediakan penyelesaian yang mudah:

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

Sebelum SQL Server 2016, fungsi pemisahan tersuai boleh dibuat:

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

Dengan pemisahan berfungsi di tempatnya, data boleh diekstrak dan diformatkan:

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

Dengan memanfaatkan teknik ini, adalah mungkin untuk memisahkan nilai yang dibataskan dengan cekap kepada berbilang baris, memudahkan pemformatan data dan tugasan analisis.

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn