0

我有以下架构。

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

我怎样才能做到这一点?非常感谢任何帮助。

4

2 回答 2

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;
于 2013-07-12T12:04:06.207 回答
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
于 2013-07-12T12:08:09.173 回答