MySQL không có hàm thay thế trực tiếp cho phần tử trong chuỗi CSV. Kết hợp SUBSTRING_INDEX() và CONCAT() có thể thay thế lần xuất hiện thứ N của một giá trị.
Ví dụ: Thay thế lần xuất hiện thứ 2 của "John" bằng "Adam"
Tạo bảng và chèn chuỗi:
CREATE TABLE DemoTable (ListOfName TEXT);
INSERT INTO DemoTable VALUES ('Carol,Sam,John,David,Bob,Mike,Robert,John,Chris,James,Jace');
Câu lệnh UPDATE:
UPDATE DemoTable
SET ListOfName = CONCAT(
SUBSTRING_INDEX(ListOfName, 'John', 2), -- Phần trước lần xuất hiện thứ 2 (giữ lại "John" đầu)
'Adam', -- Giá trị mới
SUBSTRING_INDEX(ListOfName, 'John', -1) -- Phần sau lần xuất hiện thứ 2
);
Kết quả
| ListOfName (trước) | ListOfName (sau) |
|---|---|
| Carol,Sam,John,David,Bob,Mike,Robert,John,Chris,James,Jace | Carol,Sam,John,David,Bob,Mike,Robert,Adam,Chris,James,Jace |
Giải thích
SUBSTRING_INDEX(str, delim, count):count > 0: Trả về phần từ đầu đến trước delimiter lần thứcount.count < 0: Trả về phần sau delimiter lần thứ|count|từ cuối.
- Ví dụ:
SUBSTRING_INDEX('a,b,c,d', ',', 2)→'a,b';SUBSTRING_INDEX('a,b,c,d', ',', -1)→'d'.
⚠️ Hạn chế & Cảnh báo
- Chỉ hoạt động đúng nếu giá trị tìm kiếm không chứa delimiter (ví dụ: "John" không chứa dấu phẩy).
- Không phân biệt "John" và "Johnson" — có thể khớp nhầm.
- Phức tạp, dễ sai, khó bảo trì.
Khuyến nghị thiết kế tốt hơn
Chuẩn hóa dữ liệu: tách thành bảng con DemoTable_Items (id, parent_id, item_value). Khi đó UPDATE/DELETE/INSERT trở nên đơn giản, an toàn và hiệu quả.