MySQL的variables格式为“NOT IN”值列表

疯狂地试图在一个查询types中设置一个variables:

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

所以我可以使用它

 WHERE id_campo not in (@idcamposexcluidos) 

我已经试过用不同的格式定义variables,没有运气,似乎没有find上述的具体例子:

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

没有成功。 它要么返回一个错误,要么忽略这个值。

你不能像这样使用IN子句。 它编译为IN子句中的单个string。 但是IN子句需要单独的值。

 WHERE id_campo not in (@idcamposexcluidos) 

编译

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

但应该是

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

要解决这个问题,要么使用dynamicSQL,要么在MySQL中使用FIND_IN_SET :

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

如果你使用mysql> 5.1,你可以使用:

 CREATE TYPE lista as ( clave int4, valor int4 ); CREATE OR REPLACE FUNCTION test(IN vArray lista[]) ... WHERE FIND_IN_SET(id_campo, vArray) ... 

在其他情况下,你可以使用一个技巧:

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

通过使用CONCAT() ,一个pipe道分隔符(而不是逗号)和一点“反向逻辑”,可以在NOT IN列表中使用variables,而使用NOT LIKE

例:

 SET @idcamposexcluidos = '|817|803|495|'; SELECT * FROM your_table WHERE @idcamposexcluidos NOT LIKE CONCAT('%|', id_campo, '|%'); 

这应该同时适用于string和数字列。