2012-01-13 13 views
5

Me gustaría crear un procedimiento almacenado o una consulta normal con valores pasados ​​con una matriz.¿Cómo hacer un ciclo con una matriz en MySQL?

Ejemplo:

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; 

Obviamente esto no va a funcionar, pero me gustaría saber cómo lograr esto.

Respuesta

0

un ejemplo de WHILE bucle de procedimiento dentro de almacenado:

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 ; 

puede comprobar this article para ejemplos de matrices.

2

Las bases de datos relacionales no hacen arrays, hacen escalas, filas y tablas. SQL es en gran medida un lenguaje declarativo, en lugar de procesal.

Para contar entradas en una tabla, utilice el COUNT función agregada:

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

Si usted necesita para manejar un número variable de valores para que coincidan en contra en una sola instrucción, puede crear una tabla temporal para contener los valores en lugar de utilizar IN:

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

Eso no es lo que estaba buscando. No es necesario que cuente las entradas en una tabla, sino que, en cambio, haga un ciclo de una instrucción de selección para cada entrada de la matriz. – Davide

+0

@Davide: ¿Qué quiere decir con "ciclo de una declaración seleccionada"? Por favor haga que el [ejemplo] (http://sscce.org/) en su pregunta se complete incluyendo el esquema de la tabla de muestra (como una declaración 'CREATE TABLE'), los datos (como una declaración' INSERT ... INTO') y los deseados resultados. – outis

+0

Como en un lenguaje de programación
x = nueva matriz ("a", "b", "c"); – Davide

10

tratar de hacerlo sin la rutina almacenada -

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

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

supongo que lo que desea es:

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

¿Tiene un problema con la forma de pasar una matriz a un procedimiento?

+0

El problema es que necesito hacer un ciclo para cada entrada de matriz. – Davide

2

intentar algo como esto:

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; 
2

Ninguna de las respuestas existentes trabajó para mí, así que terminó con la implementación de mi propio procedimiento de MySQL. Es bastante fácil.

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 
0

Si puede crear una tabla para almacenar los valores de matriz, puede hacerlo sin escribir un bucle. Use en el operador().

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; 
Cuestiones relacionadas