我必须运行这样的查询(查询 1) -
select something from sometable where someId in (1,2,3)
我想为 ID 部分保留一个变量,如下所示(查询 2) -
set @myIds = "1,2,3";
select something from sometable where someId in (@myIds);
但这不会给出预期的结果(给出一个空的结果集),也没有查询错误。
我检查了如果我将逗号分隔的 ID 括在引号内,查询结果为空(查询 3) -
select something from sometable where someId in ("1,2,3");
我想当我使用上面显示的变量@myIds(查询 2)时,它正在评估上述查询(查询 3)。
你需要有一个动态的sql,
SET @myIds = '1,2,3';
SET @sql = CONCAT('select something from sometable where someId in (',@myIds,')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
- SQLFiddle 演示
正确的(也是更复杂的)方法是临时表:
DROP TEMPORARY TABLE IF EXISTS `some_tmp_table`
CREATE TEMPORARY TABLE `some_tmp_table` (
`id` INT(10) UNSIGNED NOT NULL
) ENGINE=MEMORY #memory engine is optional...
插入您的 ID 的临时表
INSERT INTO some_tmp_table VALUES (1),(2),(3)...
然后使用JOIN
而不是IN()
。
SELECT something
FROM sometable s
JOIN some_tmp_table ts ON ts.id = s.someId
另一种方法是使用动态SQL,正如另一个答案所建议的那样。在应用程序中生成动态 SQL 可能更简单,但您也可以在 MySQL 中执行此操作。