【发布时间】:2014-01-20 08:44:33
【问题描述】:
我想这样做
set @a =(1,2,3);
select * from mytable where somefield in @a;
但是mysql不喜欢。
我该怎么做?
【问题讨论】:
标签: mysql
我想这样做
set @a =(1,2,3);
select * from mytable where somefield in @a;
但是mysql不喜欢。
我该怎么做?
【问题讨论】:
标签: mysql
您可以使用临时表执行此操作,如以下问题所示: How can I simulate an array variable in MySQL?
或者您可以在这个问题中使用find_in_set(): how to set an array as a mysql user variable
【讨论】:
试试这个
SET @a = '1,2,3';
SET @sql = CONCAT('SELECT * FROM test WHERE `user` IN(', @a, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
【讨论】:
解决这个问题的一种方法
SET @a = '1,2,3';
SELECT *
FROM mytable
WHERE FIND_IN_SET(somefield, @a) > 0;
注意:这将有效地导致全面扫描。
恕我直言,最好不要使用包含字符串的用户变量
SELECT *
FROM mytable t JOIN
(
SELECT 1 somefield UNION ALL
SELECT 2 UNION ALL
SELECT 3
) q
ON t.somefield = q.somefield;
另一种选择是利用动态 SQL
SET @a = '1,2,3';
SET @sql = CONCAT('SELECT * FROM mytable WHERE somefield IN(', @a, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这里是 SQLFiddle 的所有查询演示
【讨论】:
可以这样做,但使用正确的语法和准备语句,如下所示:
set @a =1,2,3;
select * from mytable where somefield in (@a);
set @crt=concat("select * from mytable where somefield in ",concat('(',@a,')'),";");
prepare smnt from @crt;
EXECUTE smnt;
DEALLOCATE PREPARE smnt;
【讨论】: