MySQL में कॉमा-अलग संख्याओं वाले स्ट्रिंग का योग निकालने के लिए कोई अंतर्निहित फ़ंक्शन नहीं है। एक कस्टम स्टोर्ड फ़ंक्शन बनाकर यह कार्य कर सकते हैं।
कस्टम फ़ंक्शन बनाएं
mysql> DELIMITER $$
mysql> CREATE FUNCTION totalSumInCommaSeparatedString(input VARCHAR(50))
-> RETURNS INT
-> DETERMINISTIC
-> NO SQL
-> BEGIN
-> DECLARE totalSum INT DEFAULT 0;
-> WHILE INSTR(input, ',') > 0 DO
-> SET totalSum = totalSum + SUBSTRING_INDEX(input, ',', 1);
-> SET input = MID(input, INSTR(input, ',') + 1);
-> END WHILE;
-> RETURN totalSum + input;
-> END $$
mysql> DELIMITER ;
उपयोग उदाहरण
1. टेबल बनाएं
mysql> CREATE TABLE DemoTable (
-> ListOfValues VARCHAR(50)
-> );
2. डेटा डालें
mysql> INSERT INTO DemoTable VALUES('20,10,40,50,60');
3. फ़ंक्शन कॉल करें
mysql> SELECT totalSumInCommaSeparatedString(ListOfValues) AS TotalSum
-> FROM DemoTable;
4. परिणाम
+----------+ | TotalSum | +----------+ | 180 | +----------+
फ़ंक्शन विश्लेषण
INSTR(input, ',')- कॉमा की स्थिति ढूंढता हैSUBSTRING_INDEX(input, ',', 1)- पहली संख्या निकालता हैMID(input, pos + 1)- शेष स्ट्रिंग लेता है- लूप तब तक चलता है जब तक कॉमा नहीं मिलते
- अंतिम संख्या (बिना कॉमा) अंत में जोड़ी जाती है
सीमाएं
- केवल पूर्णांक के लिए काम करता है (दशमलव काट दिए जाते हैं)
- खाली स्ट्रिंग या अमान्य डेटा पर त्रुटि दे सकता है
- बड़े स्ट्रिंग के लिए धीमा (लूप-आधारित)
- ऋणात्मक संख्याएं संभालता है
बेहतर विकल्प (MySQL 8.0+)
-- रिकर्सिव CTE के साथ
WITH RECURSIVE split AS (
SELECT
CAST(SUBSTRING_INDEX(ListOfValues, ',', 1) AS UNSIGNED) AS val,
SUBSTRING(ListOfValues, LENGTH(SUBSTRING_INDEX(ListOfValues, ',', 1)) + 2) AS rest
FROM DemoTable
UNION ALL
SELECT
CAST(SUBSTRING_INDEX(rest, ',', 1) AS UNSIGNED),
SUBSTRING(rest, LENGTH(SUBSTRING_INDEX(rest, ',', 1)) + 2)
FROM split
WHERE rest != ''
)
SELECT SUM(val) FROM split;
सिफारिश
उत्पादन में, डेटा को सामान्यीकृत टेबल में संग्रहीत करें (एक पंक्ति प्रति मान)।