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

Bagaimana untuk Membahagikan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris dengan Cekap?

Patricia Arquette
Patricia Arquetteasal
2025-01-01 12:47:11771semak imbas

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

Memisahkan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris

Apabila berurusan dengan jadual yang mengandungi nilai terhad dalam satu lajur, seperti penerima -medan alamat yang dipisahkan dengan koma bertitik (;), adalah perlu untuk membahagikan nilai ini kepada berbilang baris untuk pemprosesan selanjutnya atau analisis. Artikel ini meneroka pelbagai kaedah untuk mencapai ini menggunakan SQL, terutamanya memfokuskan pada mengoptimumkan prestasi dan kecekapan.

Menggunakan Fungsi STRING_SPLIT untuk SQL Server 2016

Jika anda menggunakan SQL Server 2016 atau lebih baru, anda boleh memanfaatkan fungsi STRING_SPLIT untuk membahagikan nilai terhad dengan cekap. Sintaks untuk fungsi ini adalah seperti berikut:

STRING_SPLIT(@list, @delimiter)

Begini cara anda boleh menggunakan STRING_SPLIT untuk mengekstrak alamat penerima ke dalam baris yang berasingan:

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

Mencipta Fungsi Split untuk Pra -SQL Server 2016 Versions

Untuk SQL Server versi sebelum 2016, anda boleh membuat fungsi split tersuai. Satu contoh fungsi sedemikian ialah:

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

Anda kemudian boleh menggunakan fungsi ini untuk membahagikan nilai yang dibataskan seperti berikut:

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

Pengoptimuman dan Pertimbangan

Untuk memastikan prestasi optimum, pertimbangkan petua berikut:

  • Gunakan yang sesuai kaedah berdasarkan versi SQL Server anda.
  • Elakkan menggunakan operator LIKE untuk mencari pembatas, kerana ini boleh menjadi tidak cekap.
  • Indeks lajur alamat penerima untuk carian yang lebih pantas.
  • Bahagikan set data yang besar kepada bahagian yang lebih kecil untuk diproses.
  • Gunakan Sisipan Pukal SQL Server mekanisme untuk mengimport data dengan cekap ke dalam pangkalan data.

Atas ialah kandungan terperinci Bagaimana untuk Membahagikan Nilai Terhad dalam Lajur SQL kepada Berbilang Baris dengan Cekap?. 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