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和数字列。