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