Tạo CSV output trực tiếp với CONCAT()
Dùng CONCAT(cot1, ',', cot2, ',', cot3) để nối các cột thành chuỗi CSV. Khác với CONCAT_WS(), CONCAT() trả về NULL nếu bất kỳ cột nào NULL.
Cú pháp
SELECT CONCAT(cot1, ',', cot2, ',', cot3) AS CSVFormat
FROM tenBang;
Ví dụ (trùng dữ liệu bài CONCAT_WS)
Bảng CSVFormatOutputs:
CREATE TABLE CSVFormatOutputs (
StudentId INT NOT NULL AUTO_INCREMENT,
StudentName VARCHAR(20), StudentAge INT,
PRIMARY KEY (StudentId)
);
INSERT INTO CSVFormatOutputs (StudentName, StudentAge) VALUES
('Mike',23), ('John',26), ('Sam',19), ('Carol',27), ('Bob',24);
Xuất CSV:
SELECT CONCAT(StudentId, ',', StudentName, ',', StudentAge) AS CSVFormat
FROM CSVFormatOutputs;
Kết quả
+------------+
| CSVFormat |
+------------+
| 1,Mike,23 |
| 2,John,26 |
| 3,Sam,19 |
| 4,Carol,27 |
| 5,Bob,24 |
+------------+
⚠️ Vấn đề NULL với CONCAT
SELECT CONCAT('a', ',', NULL, ',', 'c'); -- Kết quả: NULL (toàn bộ)
Giải pháp: Dùng COALESCE(cot, '') hoặc chuyển sang CONCAT_WS().
Xuất CSV chuẩn (có header, escape) - KHUYẾN NGHỊ
Không nên tự xây CSV bằng CONCAT cho production. Dùng:
-- 1. INTO OUTFILE (server-side, cần quyền FILE)
SELECT * FROM bang INTO OUTFILE '/var/lib/mysql-files/out.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n';
-- 2. mysql command line (client-side)
mysql -u user -p -e "SELECT * FROM bang" --batch --raw database | sed 's/\t/,/g' > out.csv
-- 3. Python script (csv module) - linh hoạt nhất
Khi nào dùng CONCAT/CSVFormat
- Debug nhanh, ad-hoc, dữ liệu nhỏ, không có NULL, không chứa dấu phẩy/ngoặc trong dữ liệu.
- Copy-paste vào Excel/Text editor.