2012-01-13 8 views
5

Mi piacerebbe creare una stored procedure o una query normale con valori passati con un array.Come ciclare con un array in MySQL?

Esempio:

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; 

Ovviamente questo non funziona, ma mi piacerebbe sapere come raggiungere questo obiettivo.

risposta

0

un esempio di WHILE looping stored procedure:

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 ; 

è possibile controllare this article per gli esempi di array.

2

I database relazionali non eseguono array, eseguono scalari, righe e tabelle. SQL è in gran parte un linguaggio dichiarativo, piuttosto che procedurale.

Per contare le voci in una tabella, utilizzare la COUNT funzione di aggregazione:

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

Se è necessario gestire un numero variabile di valori per abbinare contro in una singola istruzione, è possibile creare una tabella temporanea per contenere i valori invece di utilizzare IN:

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

Questo non è quello che stavo cercando. Non ho bisogno di contare le voci in una tabella, ma, invece, di eseguire il ciclo di un'istruzione select per ciascuna voce dell'array. – Davide

+0

@Davide: cosa intendi per "ciclare un'istruzione select"? Si prega di completare l'esempio [http://sscce.org/] nella domanda includendo lo schema della tabella di esempio (come un'istruzione 'CREATE TABLE'), i dati (come un'istruzione' INSERT ... INTO') e si desidera risultati. – outis

+0

Come in un linguaggio di programmazione
x = new Array ("a", "b", "c"); – Davide

10

cercare di farlo senza routine memorizzate -

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

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

Credo che si desidera solo per:

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

Avete un problema con il modo di passare un array ad una procedura?

+0

Il problema è che ho bisogno di andare in bicicletta per ogni voce dell'array. – Davide

2

provare qualcosa di simile:

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

Nessuno di risposte esistenti lavorato per me, così ho finito di attuare la mia procedura di MySQL. È abbastanza facile

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

Se è possibile creare una tabella per memorizzare i valori di matrice, è possibile farlo senza scrivere un ciclo. Usa l'operatore 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; 
Problemi correlati