用于"NOT IN"值列表的MySQL变量格式

lui*_*son 65 mysql sql in-clause

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

SET @idcamposexcluidos='817,803,495';
Run Code Online (Sandbox Code Playgroud)

所以我可以在它上面使用它

WHERE id_campo not in (@idcamposexcluidos)
Run Code Online (Sandbox Code Playgroud)

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

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


SET @idcamposexcluidos=817,803,495;
Run Code Online (Sandbox Code Playgroud)

没有成功.它要么返回错误要么忽略值.

jue*_*n d 106

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

WHERE id_campo not in (@idcamposexcluidos)
Run Code Online (Sandbox Code Playgroud)

编译成

WHERE id_campo not in ('817,803,495')
Run Code Online (Sandbox Code Playgroud)

但它应该是

WHERE id_campo not in ('817','803','495')
Run Code Online (Sandbox Code Playgroud)

要克服这个问题,要么使用动态SQL,要么在MySQL中使用FIND_IN_SET:

SET @idcamposexcluidos='817,803,495';
...
WHERE FIND_IN_SET(id_campo, @idcamposexcluidos) = 0
Run Code Online (Sandbox Code Playgroud)

但使用像FIND_IN_SET()无法使用索引的功能.

  • 如果你想使用IN子句而不是NOT IN,只需将'= 0'替换为'> 0' - > WHERE FIND_IN_SET(id_campo,@ idempmposexcluidos)> 0 (5认同)
  • @Bruno你也可以这样做:`WHERE FIND_IN_SET(id_campo,@ idempmposexcluidos)`.也就是说,将"FIND_IN_SET"的结果视为布尔值.NOT IN等效表达式的答案也可以这样写:`WHERE NOT FIND_IN_SET(id_campo,@ idempmposexcluidos)` (3认同)
  • 关于此的重要说明:数据库引擎似乎不够智能,无法优化查询.`EXPLAIN EXTENDED SELECT*FROM users WHERE FIND_IN_SET(user_id,@ userlist)`==>全表扫描(在大表上非常慢).`EXPLAIN EXTENDED SELECT*FROM users WHERE user_id IN(1,2,3,4)`==>使用主键索引(非常快).(在MySQL 5.6/innodb上测试过.) (2认同)