2012-01-13 18 views
5

Tôi muốn tạo một thủ tục lưu sẵn hoặc một truy vấn bình thường với các giá trị được truyền với một mảng.Làm thế nào để chu kỳ với một mảng trong MySQL?

Ví dụ:

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; 

Rõ ràng đây là sẽ không làm việc, nhưng tôi muốn biết làm thế nào để đạt được điều này.

Trả lời

0

một ví dụ về WHILE loop thủ tục lưu trữ bên trong:

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 ; 

bạn có thể kiểm tra this article cho ví dụ về mảng.

2

Cơ sở dữ liệu quan hệ không làm mảng, chúng thực hiện vô hướng, hàng và bảng. SQL phần lớn là một khai báo, chứ không phải là thủ tục, ngôn ngữ.

Để đếm các mục trong một bảng, sử dụng COUNT chức năng tổng hợp:

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

Nếu bạn cần phải xử lý một số biến các giá trị để phù hợp với trong một tuyên bố duy nhất, bạn có thể tạo một bảng tạm thời để giữ các giá trị thay vì sử dụng IN:

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

Đó không phải là những gì tôi đang tìm kiếm. Tôi không cần phải đếm các mục trong một bảng mà thay vào đó, để chu kỳ một câu lệnh chọn cho mỗi mục nhập mảng. – Davide

+0

@Davide: Bạn có ý gì bằng cách "chu kỳ một câu lệnh chọn"? Hãy làm cho [ví dụ] (http://sscce.org/) trong câu hỏi của bạn hoàn thành bằng cách bao gồm lược đồ bảng mẫu (như một câu lệnh 'CREATE TABLE'), dữ liệu (như một câu lệnh' INSERT ... INTO') và mong muốn các kết quả. – outis

+0

Như trong ngôn ngữ lập trình
x = mảng mới ("a", "b", "c"); – Davide

10

Cố gắng làm điều đó mà không cần thói quen lưu trữ -

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

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

Tôi đoán rằng bạn chỉ muốn:

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

Bạn có một vấn đề với làm thế nào để vượt qua một mảng đến một thủ tục?

+0

Vấn đề là tôi cần phải chu kỳ cho mỗi mục nhập mảng. – Davide

2

Hãy thử một cái gì đó như thế này:

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

Cả câu trả lời hiện làm việc cho tôi, vì vậy tôi đã kết thúc với việc thực hiện thủ tục MySQL của riêng tôi. Nó khá dễ dàng.

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

Nếu bạn có thể tạo bảng để lưu trữ các giá trị mảng bạn có thể thực hiện mà không cần viết vòng lặp. Sử dụng toán tử 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; 
Các vấn đề liên quan