我想创建一个存储过程或普通查询,其值与数组一起传递。
示例:
CREATE PROCEDURE proc()
BEGIN
DECLARE cont INTEGER;
DECLARE var ARRAY;
SET cont = 0;
SET var = ("hi", "hello", "good", ...)
WHILE cont < 12 DO
SELECT * FROM tablex
WHERE name = var[cont];
SET cont = cont + 1;
END WHILE;
END;
显然这不起作用,但我想知道如何实现这一点。
答案 0 :(得分:10)
尝试在没有存储例程的情况下进行 -
SET @arr = 'hi,hello,good'; -- your array
SELECT COUNT(*) FROM tablex
WHERE FIND_IN_SET (name, @arr); -- calculate count
答案 1 :(得分:5)
现有的答案都不适合我,所以我最终实现了自己的MySQL程序。这很容易。
PROCEDURE db.loop_through_array()
BEGIN
DECLARE var varchar(150) DEFAULT 'hi,hello,good';
DECLARE element varchar(150);
WHILE var != '' DO
SET element = SUBSTRING_INDEX(var, ',', 1);
SELECT * FROM tablex WHERE name = element;
IF LOCATE(',', var) > 0 THEN
SET var = SUBSTRING(var, LOCATE(',', var) + 1);
ELSE
SET var = '';
END IF;
END WHILE;
END
答案 2 :(得分:2)
关系数据库不执行数组,它们执行标量,行和表。 SQL主要是一种声明性语言,而不是程序性语言。
要计算表格中的条目,请使用COUNT
聚合函数:
SELECT COUNT(*)
FROM tablex
WHERE name IN ("hi", "hello", "good", ...)
如果需要在单个语句中处理可变数量的值以匹配,则可以创建一个临时表来保存值而不是使用IN
:
SELECT COUNT(*)
FROM tablex
JOIN names ON tablex.name=names.name
答案 3 :(得分:2)
尝试这样的事情:
CREATE PROCEDURE proc()
BEGIN
DECLARE cont INTEGER;
SET cont = 0;
CREATE TEMPORARY TABLE array_table (idx INT, value VARCHAR(20));
INSERT INTO array_table (idx, value) VALUES (1,"hi"),(2,"hello"),(3,"good"),...;
WHILE cont < 12 DO
SELECT * FROM tablex
WHERE name IN (SELECT value FROM array_table WHERE idx = cont);
SET cont = cont + 1;
END WHILE;
END;
答案 4 :(得分:0)
存储过程中WHILE
循环的示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS WhileLoopProc$$
CREATE PROCEDURE WhileLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
WHILE x <= 5 DO
SET str = CONCAT(str,x,',');
SET x = x + 1;
END WHILE;
SELECT str;
END$$
DELIMITER ;
您可以查看this article有关数组的示例。
答案 5 :(得分:0)
我猜你只想:
SELECT * FROM tablex
WHERE name IN ('hi', 'hello', 'good', ...)
您对如何将数组传递给过程有疑问吗?
答案 6 :(得分:0)
如果您可以创建一个表来存储数组值,则无需编写循环即可完成。在()运算符中使用。
CREATE TABLE test_strings (element CHAR(6));
INSERT INTO test_strings (element) VALUES ('hi'),('hello'),('good');
SELECT * FROM tablex t
WHERE name IN(SELECT element FROM test_strings)
ORDER BY t.name;