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

Tìm và thay thế giá trị trong chuỗi phân cách bằng dấu phẩy trong MySQL

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,JaceCarol,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ả.