web-dev-qa-db-fra.com

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

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

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

afin que je puisse ensuite 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 ne trouve pas d'exemple précis 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. Cela renvoie une erreur ou ignore les valeurs.

64
luison

Vous ne pouvez pas utiliser la clause IN comme ça. Il compile une chaîne unique dans votre clause IN. Mais une clause IN nécessite des valeurs distinctes .

WHERE id_campo not in (@idcamposexcluidos)

compile pour

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

mais ça devrait être

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

Pour résoudre ce problème, utilisez SQL dynamique ou MySQL, vous pouvez utiliser 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(), vous ne pouvez pas utiliser d'index.

102
juergen d

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 les autres cas, 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)
4
randiel

En utilisant CONCAT(), un séparateur de tuyau (au lieu d'une virgule) et un peu de "logique inverse", vous pouvez utiliser une variable dans votre NOT IN liste, mais à la place - en utilisant NOT LIKE!

Exemple:

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

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

Cela devrait fonctionner avec les colonnes de chaîne et numériques.

1
newfurniturey