将数组传递给MySQL存储的例程

我需要将一个string数组作为parameter passing给MySQL存储例程。 该数组可能会很长,其元素数量不固定。 然后我想把string值放到一列内存表中,这样我就可以处理数据了。 我不知道这是否可以在MySQL中完成。 也许肮脏的解决方法是必要的。

例如,我有香蕉苹果桔子的string。 现在我想从我的MySQL Fruits表中获取这些水果的数据。 伪代码:

 create function GetFruits(Array fruitArray) declare @temp table as fruitName varchar(100) end @temp = convert fruitArray to table select * from Fruits where Name in (select fruitName from @temp) end 

Microsoft SQL Server允许您使用TEXT数据types并将数组作为XMLstring提交,从而快速创build内存表。 但是,我不认为这种技术在MySQL中是可能的。

任何帮助如何做到这一点将不胜感激!

您可以传递一个string与您的列表,并使用一个准备好的语句来运行查询,例如 –

 DELIMITER $$ CREATE PROCEDURE GetFruits(IN fruitArray VARCHAR(255)) BEGIN SET @sql = CONCAT('SELECT * FROM Fruits WHERE Name IN (', fruitArray, ')'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END $$ DELIMITER ; 

如何使用:

 SET @fruitArray = '\'apple\',\'banana\''; CALL GetFruits(@fruitArray); 

像这样简单地使用FIND_IN_SET :

 mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2 

所以你可以这样做:

 select * from Fruits where FIND_IN_SET(fruit, fruitArray) > 0 

与临时表一起使用连接。 你不需要将临时表传递给函数, 它们是全局的 。

 create temporary table ids( id int ) ; insert into ids values (1),(2),(3) ; delimiter // drop procedure if exists tsel // create procedure tsel() -- uses temporary table named ids. no params READS SQL DATA BEGIN -- use the temporary table `ids` in the SELECT statement or -- whatever query you have select * from Users INNER JOIN ids on userId=ids.id ; END // DELIMITER ; CALL tsel() ; -- call the procedure 

这有助于我做到这一点希望这会帮助你..

 CREATE PROCEDURE `test`(IN Array_String VARCHAR(100)) BEGIN SELECT * FROM Table_Name WHERE FIND_IN_SET(field_name_to_search, Array_String); END//; 

呼叫:

  call test('3,2,1'); 

如果你不想使用临时表,这里是一个可以使用的函数的分割string

 SET @Array = 'one,two,three,four'; SET @ArrayIndex = 2; SELECT CASE WHEN @Array REGEXP CONCAT('((,).*){',@ArrayIndex,'}') THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@Array,',',@ArrayIndex+1),',',-1) ELSE NULL END AS Result; 
  • SUBSTRING_INDEX(string, delim, n)返回第一个n
  • SUBSTRING_INDEX(string, delim, -1)只返回最后一个
  • REGEXP '((delim).*){n}'检查是否有n个分隔符(即你在界限内)

我为我的问题提出了一个尴尬但function性的解决scheme。 它适用于一维数组(更多维将是棘手的)和适合varcharinput:

  declare pos int; -- Keeping track of the next item's position declare item varchar(100); -- A single item of the input declare breaker int; -- Safeguard for while loop -- The string must end with the delimiter if right(inputString, 1) <> '|' then set inputString = concat(inputString, '|'); end if; DROP TABLE IF EXISTS MyTemporaryTable; CREATE TEMPORARY TABLE MyTemporaryTable ( columnName varchar(100) ); set breaker = 0; while (breaker < 2000) && (length(inputString) > 1) do -- Iterate looking for the delimiter, add rows to temporary table. set breaker = breaker + 1; set pos = INSTR(inputString, '|'); set item = LEFT(inputString, pos - 1); set inputString = substring(inputString, pos + 1); insert into MyTemporaryTable values(item); end while; 

例如,对于此代码的input可能是stringApple|Banana|OrangeMyTemporaryTable将填充三行,分别包含AppleBananaOrangestring。

我认为string处理的速度慢会使这种方法无用,但速度足够快(对于1000个条目数组只有几分之一秒)。

希望这有助于某人。

这模拟了一个字符数组,但是您可以用SUBSTRreplaceELT来模拟一个string数组

 declare t_tipos varchar(255) default 'ABCDE'; declare t_actual char(1); declare t_indice integer default 1; while t_indice<length(t_tipos)+1 do set t_actual=SUBSTR(t_tipos,t_indice,1); select t_actual; set t_indice=t_indice+1; end while;