9

我希望有人能够提供帮助。我已经创建了我的第一个存储过程(没什么花哨的)但是我遇到了一个问题。

我想给它一个字符串输入,例如 1,2,3,4,5 然后它做一个简单的SELECT * FROM [TABLE] WHERE EAN IN (VAR);

所以存储过程如下所示:

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255))
BEGIN

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1);

END

我正在尝试像这样执行它:

作品

call moments.new_procedure('5045318357397')

不工作

call moments.new_procedure('5045318357397,5045318357427');

这会执行但不会带回任何结果。是否将第二个语句归类为字符串,所以它这样做:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427')

而不是这个:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427')

我如何必须格式化执行查询中的输入以使其以逗号分隔的字符串作为输入?

4

2 回答 2

19

你可以使用:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1)

假设它实际上是逗号分隔的,这应该可以工作。在这种情况下,任何其他定界都不起作用。

于 2012-09-17T16:12:17.877 回答
2

假设您传递的字符串以某种方式经过验证并且不包含恶意 sql,您可以使用准备好的语句:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')');
EXECUTE stmt1;
于 2012-09-17T16:06:29.803 回答