у меня есть разделенная запятыми строка с одинарной кавычкой
select * from demoProject WHERE id IN(1,2,3);
set @ids := "'1,2,3'"; select * from demoProject WHERE id IN(@ids)
Первый запрос работает нормально, но второй запрос извлекает только данные со связанным идентификатором ‘1’. Где я ошибаюсь со вторым запросом?
Проблема в том, что вы вставляете STRING в оператор IN, чтобы получить условие: id IN('1,2,3')
, Вы должны использовать динамический SQL в этом случае.
Также в MySQL вы можете использовать FIND_IN_SET () функция, чтобы найти номер в разделенном запятыми STRING. Так что это может помочь здесь:
set @ids := "'1,2,3'"; select * from demoProject WHERE FIND_IN_SET(id,@ids);
попробуйте изменить свой идентификатор с
set @ids := "'1,2,3'";
в
set @ids := "'1','2','3'";
Это не работает, потому что @ids
трактуется как строка Неявное преобразование в целое число всегда даст вам только первое число.
Единственный способ сделать это — использовать подготовленные операторы (которые в этом случае должны использоваться в хранимой процедуре):
DELIMITER $$
CREATE PROCEDURE sp_prep_stmt(IN ids int)
BEGIN
SET @sql = 'select * from demoProject WHERE id IN(?);';
PREPARE stmt FROM @sql;
EXECUTE stmt USING ids;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
Затем выполните процедуру с
CALL sp_prep_stmt('1, 2, 3');