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

Đếm số giá trị trong trường dữ liệu phân cách bằng dấu phẩy trong MySQL

Để đế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ốc
  • CHAR_LENGTH(REPLACE(ten_cot, ',', '')): Độ dài chuỗi sau khi xóa tất cả dấu phẩy
  • Hiệ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;