Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tính tổng chuỗi số phân cách bằng dấu phẩy bằng hàm tự định nghĩa trong MySQL

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

  1. INSTR(input, ',') tìm vị trí dấu phẩy đầu tiên.
  2. SUBSTRING_INDEX(input, ',', 1) lấy phần tử đầu tiên.
  3. MID(input, pos + 1) cắt bỏ phần tử đã xử lý.
  4. 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ần DECIMAL cho số thực.
  • Không xử lý khoảng trắng: '20, 10' sẽ lỗi. Thêm TRIM().
  • 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_TABLE sau 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.