Maison >base de données >tutoriel mysql >Comment analyser efficacement les chaînes séparées par des virgules pour les listes SQL IN ?

Comment analyser efficacement les chaînes séparées par des virgules pour les listes SQL IN ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-09 14:21:41605parcourir

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

Analyser la chaîne séparée par des virgules dans la liste IN dans la clause SQL WHERE

Supposons que la procédure stockée reçoive un paramètre de chaîne séparée par des virgules qui représente plusieurs valeurs, telles que le nom d'utilisateur ou le numéro de compte. Afin de filtrer les lignes en fonction de ces valeurs, nous devons construire une liste IN dans la clause WHERE.

L'approche recommandée dans SQL Server 2005 et versions ultérieures consiste à utiliser des fonctions table, par exemple :

<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>

Pour utiliser cette fonction pour analyser une chaîne dans une liste d'IN, construisez une sous-requête :

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

Vous pouvez également utiliser une méthode simple mais moins efficace de correspondance de modèles en utilisant l'opérateur LIKE :

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

En revanche, l'utilisation de la fonction f_split peut offrir de meilleures performances, en particulier lorsqu'il s'agit de grands ensembles de 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