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

9
我想创建一个带有数组传递值的存储过程或普通查询。
例如:
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个回答

15

尝试不使用存储过程来实现 -

SET @arr = 'hi,hello,good'; -- your array

SELECT COUNT(*) FROM tablex
  WHERE FIND_IN_SET (name, @arr); -- calculate count

12

现有的答案都对我没用,所以最终我自己实现了一个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

1
Devart的答案对于这个例子非常有效。在我的情况下,我想要添加账户、用户名、密码和相同的权限集合。神经递质的解决方案对于这种情况很有效。 - BenDavid
能否将tablex作为元素的变量?当我尝试这样做时,MySQL会认为它是一个表,并说表模式.element不存在。如何使用变量作为表格,并且var将包含所有表的定义? - bennes

3

尝试类似以下代码:

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;

1

存储过程内使用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 ;

你可以查看这篇文章来了解数组的例子。


1
关系型数据库不支持数组,而是支持标量、行和表。SQL主要是一种声明性语言,而非过程性语言。
要计算表中的条目数,请使用COUNT聚合函数:
SELECT COUNT(*)
  FROM tablex
  WHERE name IN ("hi", "hello", "good", ...)

如果您需要在单个语句中处理可变数量的值以进行匹配,可以创建一个临时表来保存这些值,而不是使用IN

SELECT COUNT(*)
  FROM tablex
  JOIN names ON tablex.name=names.name

这不是我要找的。我不需要计算表中的条目,而是需要为每个数组条目循环一个选择语句。 - Davide
@Davide:您所说的“循环选择语句”是什么意思?请在您的问题中包含示例表模式(作为“CREATE TABLE”语句)、数据(作为“INSERT ... INTO”语句)和期望结果,使问题完整。同时请参考示例 - outis
在编程语言中,x = new Array("a", "b", "c"); - Davide
@Davide:你是指“循环”吗?循环并不是你需要的,那只是你对其他问题的解决方案,而你还没有描述这个问题。编辑你的问题并解释你真正需要的。SQL并不是真正的编程语言,它是一种声明性数据语言。它有过程元素,但这些都是附加的,不应该成为主要表达方式。 - outis

-1

如果你可以创建一个用于存储数组值的表格,那么你就可以不用写循环实现它。使用 in() 运算符。

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;

-2

我猜你只是想要:

SELECT * FROM tablex
WHERE name IN ('hi', 'hello', 'good', ...)

你是否遇到了如何将数组传递给一个过程的问题?


1
问题在于我需要循环遍历每个数组条目。 - Davide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接