При отправке строки разделенных запятыми идентификаторов, как varchar, в хранимую процедуру MySQL, я не могу использовать эту строку как часть предложения IN с возвращенными правильными результатами. Строка усекается до десятичной точки, и используется только первое значение.
Я думал, что смогу обойти это, подготовив и затем выполнив инструкцию, но это все равно вернуло только совпадение для первого значения.
Примеры кода могут сделать вещи немного понятнее. Я хочу преобразовать следующее в хранимую процедуру (с динамическим предложением in):
select id, name from cities where id in (1,2,3);
Это моя хранимая процедура с использованием подготовленного оператора:
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 ;
При вызове хранимой процедуры я получаю совпадение только для города '1':
call cities_select_by_ids_prepare('1, 2, 3');
Вот скрипт создания и вставки для таблицы и данных:
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');