MySQL không có hàm built-in để tách và cộng chuỗi CSV. Có thể tạo Stored Function dùng vòng lặp WHILE để xử lý.
Tạo hàm totalSumInCommaSeparatedString
DELIMITER $$
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; -- Cộng phần tử cuối cùng
END $$
DELIMITER ;
Sử dụng hàm
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable (ListOfValues VARCHAR(50));
INSERT INTO DemoTable VALUES ('20,10,40,50,60');
Gọi hàm:
SELECT totalSumInCommaSeparatedString(ListOfValues) AS TotalSum FROM DemoTable;
Kết quả
| TotalSum |
|---|
| 180 |
Giải thích logic
INSTR(input, ',')tìm vị trí dấu phẩy đầu tiên.SUBSTRING_INDEX(input, ',', 1)lấy phần tử đầu tiên.MID(input, pos + 1)cắt bỏ phần tử đã xử lý.- Lặp cho đến khi không còn dấu phẩy, cộng phần tử cuối.
⚠️ Hạn chế & Cải tiến
- Chỉ hỗ trợ số nguyên (dùng
INT). CầnDECIMALcho số thực. - Không xử lý khoảng trắng:
'20, 10'sẽ lỗi. ThêmTRIM(). - Hiệu năng kém trên chuỗi dài (vòng lặp row-by-row).
- MySQL 8.0+: Có thể dùng
JSON_TABLEsau khi chuyển CSV → JSON array.
Cách hiện đại (MySQL 8.0+)
SELECT SUM(CAST(val AS UNSIGNED))
FROM DemoTable,
JSON_TABLE(CONCAT('[', REPLACE(ListOfValues, ',', ','), ']'), '$[*]' COLUMNS (val VARCHAR(20) PATH '$')) AS jt;
Khuyên dùng: Chuẩn hóa dữ liệu (tách bảng con) thay vì xử lý chuỗi CSV trong SQL.