2012-01-13 9 views
5

मैं एक सरणी के साथ पारित मानों के साथ संग्रहीत प्रक्रिया या सामान्य क्वेरी बनाना चाहता हूं।MySQL में किसी सरणी के साथ चक्र कैसे करें?

उदाहरण:

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; 

जाहिर है यह काम नहीं होगा, लेकिन मुझे पता है कि यह कैसे प्राप्त करने के लिए करना चाहते हैं।

उत्तर

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 देख सकते हैं।

2

रिलेशनल डेटाबेस एरे नहीं करते हैं, वे स्केलर, पंक्तियां और टेबल करते हैं। एसक्यूएल प्रक्रियात्मक, भाषा के बजाय काफी हद तक एक घोषणात्मक है।

किसी तालिका में प्रविष्टियों गिनती करने के लिए, COUNT समेकित फ़ंक्शन का उपयोग करें:

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

आप मान एक भी बयान में के खिलाफ मैच के लिए के परिवर्तनशील संभालने की ज़रूरत है, तो आप पकड़ करने के लिए एक अस्थायी तालिका बना सकते हैं बजाय IN का उपयोग करने का मान: संग्रहीत दिनचर्या के बिना यह करने के लिए

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

यही वह नहीं है जिसे मैं ढूंढ रहा था। मुझे किसी तालिका में प्रविष्टियों को गिनने की आवश्यकता नहीं है, बल्कि, प्रत्येक सरणी प्रविष्टि के लिए एक चयन कथन चक्र के लिए। – Davide

+0

@ डेवाइड: "चक्र एक चयन कथन" से आपका क्या मतलब है? नमूना तालिका स्कीमा ('तालिका बनाएं' कथन के रूप में, डेटा (एक 'INSERT ... INTO' कथन के रूप में) और इच्छित के रूप में कृपया अपने प्रश्न में [example] (http://sscce.org/) बनाएं परिणाम है। – outis

+0

एक प्रोग्रामिंग भाषा में
x = नया ऐरे ("ए", "बी", "सी"); – Davide

10

प्रयास करें -

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

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

मुझे लगता है कि आप बस करना चाहते हैं:

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

आप कैसे एक प्रक्रिया के लिए एक सरणी पारित करने के लिए के साथ एक समस्या है?

+0

समस्या यह है कि मुझे प्रत्येक सरणी प्रविष्टि के लिए चक्र की आवश्यकता है। – Davide

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

मौजूदा जवाब में से न तो मेरे लिए काम किया है, इसलिए मैं अपने खुद के 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 
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; 
संबंधित मुद्दे