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

Nối nhiều cột (>2) trong MySQL: CONCAT vs CONCAT_WS

Để nối nhiều cột (3, 4, 5... cột) thành một chuỗi, MySQL cung cấp 2 hàm chính: CONCAT() và CONCAT_WS() (With Separator).

Cú pháp

1. CONCAT() - Nối trực tiếp, tự thêm dấu phân cách

SELECT CONCAT(cot1, '/', cot2, '/', cot3, '/', cot4) AS ket_qua FROM bang;

2. CONCAT_WS(separator, cot1, cot2, ...) - Nối với dấu phân cách, bỏ qua NULL

SELECT CONCAT_WS('/', cot1, cot2, cot3, cot4) AS ket_qua FROM bang;

So sánh nhanh

Đặc điểmCONCATCONCAT_WS
Dấu phân cáchPhải thêm thủ côngTham số đầu tiên
Xử lý NULLTrả về NULL nếu có bất kỳ NULLBỏ qua NULL (rất tiện)
Độ dài codeDài hơnNgắn gọn
Hiệu năngTương đươngTương đương

Ví dụ minh họa

1. Tạo bảng

CREATE TABLE MoreThan2ColumnConcat (
    Id INT,
    Name VARCHAR(20),
    Age INT,
    Marks INT
);

2. Chèn dữ liệu

INSERT INTO MoreThan2ColumnConcat VALUES
(1, 'John', 24, 89),
(11, 'Larry', 25, 90),
(15, 'Mike', 26, 79),
(16, 'Sam', 21, 99);

3. Nối với CONCAT()

SELECT CONCAT(Id, '/', Name, '/', Age, '/', Marks) AS ConcatMoreFields
FROM MoreThan2ColumnConcat;

Kết quả:

+------------------+
| ConcatMoreFields |
+------------------+
| 1/John/24/89     |
| 11/Larry/25/90   |
| 15/Mike/26/79    |
| 16/Sam/21/99     |
+------------------+

4. Nối với CONCAT_WS() (khuyên dùng)

SELECT CONCAT_WS('/', Id, Name, Age, Marks) AS ConcatMoreFields
FROM MoreThan2ColumnConcat;

Kết quả:** Giống hệt CONCAT nhưng code ngắn hơn.

Ưu điểm lớn của CONCAT_WS: Xử lý NULL tự động

-- Giả sử Age của hàng 2 là NULL
INSERT INTO MoreThan2ColumnConcat VALUES (20, 'Test', NULL, 88);

-- CONCAT: Trả về NULL cho cả hàng
SELECT CONCAT(Id, '/', Name, '/', Age, '/', Marks) FROM ... WHERE Id = 2;
-- Kết quả: NULL ❌

-- CONCAT_WS: Bỏ qua NULL, nối phần còn lại
SELECT CONCAT_WS('/', Id, Name, Age, Marks) FROM ... WHERE Id = 2;
-- Kết quả: '20/Test/88' ✅

Các biến thể hữu ích

Nối với nhiều dấu phân cách khác nhau

-- CONCAT_WS chỉ dùng 1 dấu phân cách
-- Cần dấu khác nhau → dùng CONCAT
SELECT CONCAT(Id, ': ', Name, ' (', Age, ' tuổi, ', Marks, ' điểm)') 
FROM MoreThan2ColumnConcat;

Nối tất cả cột của bảng (dynamic)

Nối giá trị duy nhất (GROUP_CONCAT)

SELECT GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR ', ') 
FROM MoreThan2ColumnConcat;

Best Practice

  • Mặc định dùng CONCAT_WS cho nối cột có thể NULL (tên, địa chỉ, tag...)
  • Dùng CONCAT khi cần kiểm soát chính xác dấu phân cách hoặc format phức tạp
  • Luôn CAST kiểu số sang CHAR nếu cần: CONCAT_WS('-', CAST(Id AS CHAR), Name)
  • Tránh dùng || (Oracle/PostgreSQL) - MySQL hiểu là OR logic trừ khi bật PIPES_AS_CONCAT