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

GROUP_CONCAT với dấu phân cách cho trường rỗng trong MySQL


Vấn đề

GROUP_CONCAT mặc định bỏ qua giá trị NULL, nhưng giữ chuỗi rỗng '' → tạo ra dấu phân cách kép (,,) khi có nhiều chuỗi rỗng liên tiếp. Cần thay ',,' thành ',' đơn.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu (có chuỗi rỗng)

mysql> CREATE TABLE DemoTable (
    Id INT,
    Number VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES 
(10, '456'), (11, '345'), (10, ''), (10, '278'), (10, ''), (10, '789');

Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+------+--------+
| Id   | Number |
+------+--------+
| 10   | 456    |
| 11   | 345    |
| 10   |        |
| 10   | 278    |
| 10   |        |
| 10   | 789    |
+------+--------+

Truy vấn GROUP_CONCAT + REPLACE

mysql> SELECT Id, REPLACE(GROUP_CONCAT(Number), ',,', ',') 
FROM DemoTable GROUP BY Id;

Kết quả

+------+----------------------------------------+
| Id   | REPLACE(GROUP_CONCAT(Number), ',,', ',') |
+------+----------------------------------------+
| 10   | 456,278,789                            |
| 11   | 345                                    |
+------+----------------------------------------+

Giải thích

  • GROUP_CONCAT(Number) cho Id=10 tạo ra: '456,,278,,789' (chuỗi rỗng tạo ',,').
  • REPLACE(..., ',,', ',') gộp dấu phẩy kép thành đơn.

⚠️ Vấn đề: Nhiều chuỗi rỗng liên tiếp > 2

Nếu có 3 chuỗi rỗng: '456,,,278' → REPLACE 1 lần chỉ thành '456,,278' (còn lại 1 cặp).

Giải pháp mạnh hơn: Lọc trước khi GROUP_CONCAT

SELECT Id, GROUP_CONCAT(Number) 
FROM (SELECT Id, Number FROM DemoTable WHERE Number <> '' AND Number IS NOT NULL) t
GROUP BY Id;

Hoặc MySQL 8.0:

SELECT Id, GROUP_CONCAT(NULLIF(TRIM(Number), '')) 
FROM DemoTable GROUP BY Id;

NULLIF chuyển chuỗi rỗng thành NULL, GROUP_CONCAT bỏ qua NULL.

Lưu ý GROUP_CONCAT

  • Mặc định max length 1024 byte. Tăng: SET SESSION group_concat_max_len = 1000000;
  • Sắp xếp trong group: GROUP_CONCAT(Number ORDER BY Number).
  • Dấu phân cách tùy chỉnh: GROUP_CONCAT(Number SEPARATOR ';').