如何在MySQL中使用数组循环?

时间:2012-01-13 13:37:36

标签: mysql arrays stored-procedures while-loop

我想创建一个存储过程或普通查询,其值与数组一起传递。

示例:

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;

显然这不起作用,但我想知道如何实现这一点。

7 个答案:

答案 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;