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

bd96500e110b49cbb3cd949968f18be7.png

When sending a string of comma separated ids, as a varchar, to a MySQL stored procedure I can not use the string as part of an IN clause with the correct results returned. The string is truncated as a decimal and only the first value is being used.

I thought I would be able to get around this by preparing and then executing the statement, but this still only returned a match for the first value.

Code examples may make things a bit clearer. I want to convert the following into a stored procedure (with the in clause dynamic):

select id, name from cities where id in (1,2,3);

This is my stored procedure using a prepared statement:

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 ;

Calling the stored procedure I only get a match for the city '1':

call cities_select_by_ids_prepare('1, 2, 3');

Here is a create and insert script for the table and data:

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

解决方案

due to the way parameterization works, this is not possible.

the closest you can get it this:

where find_in_set(id, ?)

but this will not scale as as can not use an index.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值