Rumah >pangkalan data >tutorial mysql >Bagaimana Menghuraikan Rentetan Dipisahkan Koma dengan Cekap untuk Senarai SQL IN?

Bagaimana Menghuraikan Rentetan Dipisahkan Koma dengan Cekap untuk Senarai SQL IN?

Barbara Streisand
Barbara Streisandasal
2025-01-09 14:21:41605semak imbas

How to Efficiently Parse Comma-Separated Strings for SQL IN Lists?

Uraikan rentetan yang dipisahkan koma ke dalam senarai IN dalam klausa SQL WHERE

Anggap bahawa prosedur tersimpan menerima parameter rentetan dipisahkan koma yang mewakili berbilang nilai, seperti nama pengguna atau nombor akaun. Untuk menapis baris berdasarkan nilai ini, kita perlu membina senarai IN dalam klausa WHERE.

Pendekatan yang disyorkan dalam SQL Server 2005 dan ke atas adalah menggunakan fungsi bernilai jadual, contohnya:

<code class="language-sql">CREATE FUNCTION [dbo].[f_split](
    @param NVARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @t TABLE (
    val NVARCHAR(MAX),
    seq INT
)
AS
BEGIN
    SET @param += @delimiter;

    WITH a AS (
        SELECT CAST(1 AS BIGINT) AS f, CHARINDEX(@delimiter, @param) AS t, 1 AS seq
        UNION ALL
        SELECT t + 1, CHARINDEX(@delimiter, @param, t + 1), seq + 1
        FROM a
        WHERE CHARINDEX(@delimiter, @param, t + 1) > 0
    )
    INSERT @t
    SELECT SUBSTRING(@param, f, t - f), seq FROM a
    OPTION (MAXRECURSION 0);
    RETURN;
END;</code>

Untuk menggunakan fungsi ini untuk menghuraikan rentetan ke dalam senarai IN, bina subkueri:

<code class="language-sql">SELECT *
FROM yourtable 
WHERE account IN (SELECT val FROM dbo.f_split(@account, ','))</code>

Sebagai alternatif, anda boleh menggunakan kaedah pemadanan corak yang mudah tetapi kurang cekap menggunakan operator LIKE:

<code class="language-sql">WHERE account LIKE '%,' + @account + '%,</code>

Sebaliknya, menggunakan fungsi f_split boleh memberikan prestasi yang lebih baik, terutamanya apabila berurusan dengan set data yang besar.

Atas ialah kandungan terperinci Bagaimana Menghuraikan Rentetan Dipisahkan Koma dengan Cekap untuk Senarai SQL IN?. 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