如何在MySQL中求和逗号分隔的字符串(带有数字的字符串)
在MySQL中,很多时候需要对数据进行聚合计算,而聚合计算的一种常见方式就是求和。但是,有时候数据并不是规整的,比如一个字段中包含了逗号分隔的数字字符串。那么,在这种情况下,如何在MySQL中对这些字符串进行求和呢?下面将分别介绍3种方法。
阅读更多:MySQL 教程
方法一:使用 FIND_IN_SET 函数
MySQL内置函数中提供了 FIND_IN_SET 函数,这个函数的作用是查找一个值是否在一个逗号分隔的字符串列表中。那么,可以利用这个函数来对逗号分隔的字符串进行拆分,然后再对拆分后的数字进行求和。具体代码如下(语言为MySQL):
SELECT SUM(SUBSTRING_INDEX(SUBSTRING_INDEX(number_list, ',', numbers.n), ',', -1)) AS sum
FROM test, (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers
WHERE LENGTH(number_list) - LENGTH(REPLACE(number_list, ',', '')) >= numbers.n - 1;
上述代码中,test 表是包含了逗号分隔数字列表的表,number_list 列就是这个列表,numbers 表用来生成数字序列。这个查询的输出结果就是对这个列表中所有数字的求和。需要注意的是,需要自行修改数字序列的长度(这里是 1~4)。
方法二:使用正则表达式解析字符串
另一种常见的方法是使用正则表达式来解析包含逗号分隔数字字符串。具体代码如下(语言为MySQL):
SELECT SUM(SUBSTRING_INDEX(m.nums,',', 1)) AS sum
FROM
(
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(number_list, ',', numbers.n), ',', -1) AS nums
FROM test, (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers
WHERE numbers.n <= 1 + LENGTH(number_list) - LENGTH(REPLACE(number_list, ',', ''))
) m;
上述代码中,也使用了数字序列来对逗号分隔的数字串进行拆分。具体来说,利用了数字序列逐个生成需要的数字子串的特点。需要注意的是,这种方法也需要自行修改数字序列的长度。
方法三:自定义函数
除了内置函数之外,MySQL还支持自定义函数。如果需要重复使用某一段程序,则可以考虑将其封装为一个单独的函数,方便在其他地方直接调用。下面是一个示例代码(语言为MySQL):
DELIMITER //
CREATE FUNCTION sum_str(NUMBER_STR VARCHAR(1024))
RETURNS INT
BEGIN
DECLARE CURR_NUM VARCHAR(64);
DECLARE CURR_SUM INT DEFAULT 0;
DECLARE REC_NUMS CURSOR FOR SELECT DISTINCT P1.i FROM Numbers INNER JOIN (
SELECT (a.N + b.N * 10 + 1) i FROM
(SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
(SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b WHERE (a.N + b.N * 10 + 1) <= LENGTH(NUMBER_STR) - LENGTH(REPLACE(NUMBER_STR,',','')) + 1
) P1 ON P1.i = (IFNULL(NULLIF(INSTR(NUMBER_STR, ','), 0), LENGTH(NUMBER_STR)) + 1))
DO
SET CURR_NUM = (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(NUMBER_STR, ',', P1.i), ',', -1));
SET CURR_SUM = CURR_SUM + CAST(CURR_NUM AS UNSIGNED);
END DO;
RETURN CURR_SUM;
END//
DELIMITER ;
上述代码中,自定义了一个名为 sum_str 的函数,这个函数的参数是包含逗号分隔数字的字符串,函数返回值是这个数字串的求和结果。需要注意的是,在使用这个函数之前需要在MySQL中执行上述代码来创建这个函数。
结论
总的来说,对逗号分隔数字字符的求和,MySQL中提供了 FIND_IN_SET 函数来简单实现,同时也可以使用正则表达式或自定义函数来达到同样的目的。其中,自定义函数具有面向对象编程的特点,更加方便和灵活,但需要对MySQL更加熟悉。