如何使用WHERE IN mysql存储过程

时间:2011-03-21 03:20:19

标签: mysql stored-procedures

如何传递数组并在存储过程中使用WHERE IN?

我是否需要连接输入字符串或什么?

让我们说

DELIMITER $$
DROP PROCEDURE IF EXISTS `abc`.`table1`$$
CREATE PROCEDURE  `abc`.`test`
(IN somestring VARCHAR(255))
BEGIN
    SELECT * FROM abc.table1 
    WHERE flight_type IN somestring
END $$
DELIMITER ;

4 个答案:

答案 0 :(得分:4)

您可以使用字符串连接和PREPARE语句来运行动态构建的查询。

somestring必须使用有效的SQL格式构建,例如'1','2','3'

DELIMITER $$
DROP PROCEDURE IF EXISTS `abc`.`table1`$$
CREATE PROCEDURE  `abc`.`test`
(IN somestring VARCHAR(255))
BEGIN
    @s=CONCAT("
    SELECT * FROM abc.table1 
    WHERE flight_type IN (",somestring,");")
    PREPARE stmt FROM @s;
    EXECUTE @s;
END $$
DELIMITER ;

答案 1 :(得分:1)

如果FIND_IN_SET()格式为somestring,则可以使用a,b,c,d

SELECT *
FROM abc.table1
WHERE FIND_IN_SET(flight_type, somestring)

答案 2 :(得分:0)

只要somestring的格式为

,这就应该有效
"(item1, item2, item3, ... )"

如果没有,你可以在你的SP内部相应地格式化它,但我不确定最佳做法是什么。

答案 3 :(得分:0)

接受的答案需要修改才能与我的MariaDB版本配合使用。

CONCAT语句缺少分号,EXECUTE语句在 @s (变量)而不是 stmt (语句)上调用,并且拖放/创建部分令人困惑。这是我的重写:

DELIMITER $$
DROP PROCEDURE IF EXISTS `dbname`.`procedurename`$$
CREATE PROCEDURE  `dbname`.`procedurename`
(IN somestring VARCHAR(255))
BEGIN
    SET @s=CONCAT("
    SELECT * FROM dbname.table1 
    WHERE flight_type IN (",somestring,");");
    PREPARE stmt FROM @s;
    EXECUTE stmt;
END $$
DELIMITER ;