在“in”子句的存储过程中使用MySQL用户定义变量

Nic*_*ick 5 mysql sql stored-procedures

当将逗号分隔的 id 字符串作为 varchar 发送到 MySQL 存储过程时,我无法使用该字符串作为 IN 子句的一部分来返回正确的结果。该字符串被截断为小数,并且仅使用第一个值。

我以为我可以通过准备然后执行该语句来解决这个问题,但这仍然只返回第一个值的匹配项。

代码示例可能会让事情变得更清楚一些。我想将以下内容转换为存储过程(使用 in 子句动态):

select id, name from cities where id in (1,2,3);
Run Code Online (Sandbox Code Playgroud)

这是我使用准备好的语句的存储过程:

DROP PROCEDURE IF EXISTS `cities_select_by_ids` $$
CREATE PROCEDURE `cities_select_by_ids`(
    in _cityIds varchar(1000)
)
BEGIN
SET  @cityIds = _cityIds;

PREPARE stmt FROM '
    select
      id,
      name
    from cities
    where id in (?);
';

EXECUTE stmt USING @cityIds;
DEALLOCATE PREPARE stmt;

END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

调用存储过程我只得到城市“1”的匹配项:

call cities_select_by_ids_prepare('1, 2, 3');
Run Code Online (Sandbox Code Playgroud)

这是表和数据的创建和插入脚本:

CREATE TABLE cities (
  id int(10) unsigned NOT NULL auto_increment,
  name varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
);
insert into cities (name) values ('London'), ('Manchester'), ('Bristol'), ('Birmingham'), ('Brighton');
Run Code Online (Sandbox Code Playgroud)

lon*_*eck 2

由于参数化的工作方式,这是不可能的。

最接近的你可以得到它:

where find_in_set(id, ?)
Run Code Online (Sandbox Code Playgroud)

但这不会扩展,因为无法使用索引。