9

我必须运行这样的查询(查询 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)。

4

2 回答 2

6

你需要有一个动态的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;
于 2013-09-17T07:58:12.057 回答
2

正确的(也是更复杂的)方法是临时表:

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)...

然后使用 aJOIN而不是IN().

SELECT something 
FROM sometable s
JOIN some_tmp_table ts ON ts.id = s.someId

另一种方法是按照其他答案的建议使用动态 SQL。在您的应用程序中生成动态 SQL 可能更简单,但您也可以在 MySQL 中完成。

于 2013-09-17T08:05:03.473 回答