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
Lepaskan: 2025-01-01 12:47:11
asal
713 orang telah melayarinya

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)
Salin selepas log masuk

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;
Salin selepas log masuk

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
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan