如何传递数组并在存储过程中使用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 ;
答案 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 ;