Để đếm số lượng giá trị trong một cột lưu chuỗi phân cách bằng dấu phẩy (CSV), bạn tính: Số dấu phẩy + 1. Công thức dùng CHAR_LENGTH() và REPLACE().
Cú pháp
SELECT *,
(CHAR_LENGTH(ten_cot) - CHAR_LENGTH(REPLACE(ten_cot, ',', '')) + 1) AS so_luong_gia_tri
FROM ten_bang;
Giải thích công thức
CHAR_LENGTH(ten_cot): Độ dài chuỗi gốcCHAR_LENGTH(REPLACE(ten_cot, ',', '')): Độ dài chuỗi sau khi xóa tất cả dấu phẩyHiệu số = Số dấu phẩy+ 1: Số giá trị = Số dấu phẩy + 1
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE CountValuesCommaSeparated (
Id INT NOT NULL AUTO_INCREMENT,
CommaSeparatedValue TEXT,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu
INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue) VALUES
('101,104,1900,46675,7895'),
('1010,18949,37465'),
('2010,1201,2743874,7485'),
('4757,457587,48586,378575,3874765,487565');
3. Xem dữ liệu
SELECT * FROM CountValuesCommaSeparated;
Kết quả:
+----+-----------------------------------------+
| Id | CommaSeparatedValue |
+----+-----------------------------------------+
| 1 | 101,104,1900,46675,7895 |
| 2 | 1010,18949,37465 |
| 3 | 2010,1201,2743874,7485 |
| 4 | 4757,457587,48586,378575,3874765,487565 |
+----+-----------------------------------------+
4. Truy vấn đếm số giá trị
SELECT *,
(CHAR_LENGTH(CommaSeparatedValue) - CHAR_LENGTH(REPLACE(CommaSeparatedValue, ',', '')) + 1) AS TotalValue
FROM CountValuesCommaSeparated;
Kết quả:
+----+-----------------------------------------+------------+
| Id | CommaSeparatedValue | TotalValue |
+----+-----------------------------------------+------------+
| 1 | 101,104,1900,46675,7895 | 5 |
| 2 | 1010,18949,37465 | 3 |
| 3 | 2010,1201,2743874,7485 | 4 |
| 4 | 4757,457587,48586,378575,3874765,487565 | 6 |
+----+-----------------------------------------+------------+
⚠️ Các trường hợp đặc biệt cần xử lý
1. Chuỗi rỗng hoặc NULL
SELECT *,
CASE
WHEN CommaSeparatedValue IS NULL OR TRIM(CommaSeparatedValue) = '' THEN 0
ELSE CHAR_LENGTH(CommaSeparatedValue) - CHAR_LENGTH(REPLACE(CommaSeparatedValue, ',', '')) + 1
END AS TotalValue
FROM CountValuesCommaSeparated;
2. Có khoảng trắng quanh dấu phẩy
-- Chuẩn hóa trước: REPLACE(REPLACE(ten_cot, ' ', ''), ', ', ',')
-- Hoặc dùng TRIM trên từng phần tử sau khi split
Lưu ý thiết kế
Lưu trữ CSV trong 1 cột vi phạm chuẩn hóa (1NF). Nên thiết kế bảng riêng:
CREATE TABLE items (
id INT AUTO_INCREMENT PRIMARY KEY,
parent_id INT,
value VARCHAR(100),
FOREIGN KEY (parent_id) REFERENCES parent_table(id)
);
Sau đó đếm đơn giản: SELECT parent_id, COUNT(*) FROM items GROUP BY parent_id;