81 votes

Format de variable MySQL pour une liste de valeurs "NOT IN".

Je deviens fou en essayant de définir une variable dans une requête de type :

SET @idcamposexcluidos='817,803,495';

afin que je puisse l'utiliser sur un

WHERE id_campo not in (@idcamposexcluidos)

J'ai essayé de définir la variable dans différents formats sans succès et je n'ai pas trouvé d'exemple spécifique pour ce qui précède :

SET @idcamposexcluidos='(817,803,495)';
...
WHERE id_campo not in @idcamposexcluidos

SET @idcamposexcluidos=817,803,495;

sans succès. Il renvoie une erreur ou ignore les valeurs.

134voto

juergen d Points 85039

Vous ne pouvez pas utiliser le IN clause comme ça. Ça se compile en un simple dans votre IN clause. Mais une IN besoins en clause séparé valeurs.

WHERE id_campo not in (@idcamposexcluidos)

compile en

WHERE id_campo not in ('817,803,495')

mais il devrait être

WHERE id_campo not in ('817','803','495')

Pour résoudre ce problème, vous pouvez utiliser le SQL dynamique ou MySQL. FIND_IN_SET :

SET @idcamposexcluidos='817,803,495';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0

mais en utilisant une fonction comme FIND_IN_SET() ne peut pas utiliser d'index.

4voto

randiel Points 189

Si vous utilisez mysql > 5.1, vous pouvez utiliser :

CREATE TYPE lista as (
    clave int4,
    valor int4
);

CREATE OR REPLACE FUNCTION test(IN vArray lista[])
...

   WHERE FIND_IN_SET(id_campo, vArray)
...

dans le cas contraire, vous pouvez utiliser une astuce :

WHERE id_campo IN ( SELECT 817 as valor UNION ALL 
                SELECT 803 as valor UNION ALL
                    SELECT 495 as valor)

2voto

newfurniturey Points 16866

En utilisant CONCAT() un séparateur de type pipe (au lieu d'une virgule), et un peu de "logique inverse", vous pouvez utiliser une variable dans votre fichier d'échange de données. NOT IN mais plutôt - en utilisant NOT LIKE !

Exemple :

SET @idcamposexcluidos = '|817|803|495|';

SELECT
    *
FROM
    your_table
WHERE
    @idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%');

Cela devrait fonctionner aussi bien avec les colonnes de type chaîne de caractères qu'avec les colonnes numériques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X