81

疯狂地尝试在类型查询中设置变量:

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

所以我可以在

WHERE id_campo not in (@idcamposexcluidos)

我尝试以不同的格式定义变量,但没有运气,似乎没有找到上述的具体示例:

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


SET @idcamposexcluidos=817,803,495;

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

4

3 回答 3

134

你不能使用这样的IN子句。它在您的子句中编译为单个字符串。IN但是一个IN子句需要单独的值。

WHERE id_campo not in (@idcamposexcluidos)

编译为

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

但应该是

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

要克服这个问题,可以使用动态 SQL 或在 MySQL 中使用FIND_IN_SET

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

但是使用类似的功能FIND_IN_SET()不能使用索引。

于 2012-08-14T17:35:27.160 回答
4

如果你使用 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)
于 2012-08-14T18:19:39.760 回答
2

通过使用CONCAT()管道分隔符(而不是逗号)和一些“逆向逻辑”,您可以在NOT IN列表中使用变量,但可以使用NOT LIKE!

例子:

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

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

这应该适用于字符串和数字列。

于 2012-08-14T17:56:49.747 回答