我有以下架构。
DROP TABLE IF EXISTS REF_CONNECTION1;
CREATE TABLE REF_CONNECTION1 (
BPIN INT(11) DEFAULT NULL,
RIN INT(11) DEFAULT NULL,
SRC_RIN INT(11) DEFAULT NULL,
PRIMARY KEY (BPIN,RIN,SRC_RIN)
);
INSERT INTO REF_CONNECTION1 VALUE(14,1,2);
INSERT INTO REF_CONNECTION1 VALUE(14,1,3);
INSERT INTO REF_CONNECTION1 VALUE(14,1,4);
INSERT INTO REF_CONNECTION1 VALUE(14,1,5);
INSERT INTO REF_CONNECTION1 VALUE(14,1,6);
INSERT INTO REF_CONNECTION1 VALUE(14,1,7);
SET @S1 = '2,3,4';
SELECT * FROM REF_CONNECTION1 WHERE SRC_RIN IN (@S1);
结果集只提供1行,但它应该有3行。我理解它为什么会发生,因为它实际上转换为以下查询
SELECT * FROM REF_CONNECTION1 WHERE SRC_RIN IN ('2,3,4');
但我希望它看起来像以下查询。
SELECT * FROM REF_CONNECTION1 WHERE SRC_RIN IN (2,3,4);
我该怎么做?任何帮助都非常感谢。
答案 0 :(得分:1)
你需要一份准备好的声明:
SET @S1 = '2,3,4';
set @sql = concat('SELECT * FROM REF_CONNECTION1 WHERE SRC_RIN IN (', @S1, ');');
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
答案 1 :(得分:0)
您也可以使用INSTR和CAST,但我不建议在大型数据集
上使用它 SELECT * FROM REF_CONNECTION1
WHERE INSTR(','+@S1+',',','+CAST(src_rin as CHAR(1))+',') > 0
它为您提供了灵活性,但性能不会很好
显然mySQL将','+ @ S1 +','视为单个字符(如下所示)。使用我在下面修改过的代码中显示的CONCAT,它可以正常工作
SELECT @s1,","+@s1+",",CONCAT(",",@S1,",")
FROM REF_CONNECTION1
WHERE INSTR(CONCAT(',',@S1,','),','+CAST(src_rin AS CHAR(1))+',') >0