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

Kiểm tra mã quốc gia tồn tại trong cột CSV MySQL với FIND_IN_SET

Khi một cột lưu nhiều giá trị phân cách bằng dấu phẩy (CSV), hàm FIND_IN_SET() trong MySQL cho phép kiểm tra xem một giá trị cụ thể có tồn tại trong danh sách đó hay không. Hàm này trả về vị trí (bắt đầu từ 1) nếu tìm thấy, hoặc 0 nếu không tìm thấy.

Ví dụ minh họa

Tạo bảng mã quốc gia:

mysql> CREATE TABLE DemoTable1439 (
    CountryId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    CountryCode VARCHAR(20)
);

Chèn dữ liệu (CSV):

mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('1022_US,7894_UK');
mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('6567_AUS,7894_UK');
mysql> INSERT INTO DemoTable1439 (CountryCode) VALUES ('6567_AUS');

Dữ liệu:

mysql> SELECT * FROM DemoTable1439;
+-----------+------------------+
| CountryId | CountryCode      |
+-----------+------------------+
|         1 | 1022_US,7894_UK  |
|         2 | 6567_AUS,7894_UK |
|         3 | 6567_AUS         |
+-----------+------------------+

Tìm hàng chứa '6567_AUS'

mysql> SELECT * FROM DemoTable1439 
    WHERE FIND_IN_SET('6567_AUS', CountryCode) > 0;

Kết quả (hàng 2 và 3):

+-----------+------------------+
| CountryId | CountryCode      |
+-----------+------------------+
|         2 | 6567_AUS,7894_UK |
|         3 | 6567_AUS         |
+-----------+------------------+

Giải thích FIND_IN_SET

  • Cú pháp: FIND_IN_SET(str, strlist)
  • strlist: Chuỗi các giá trị phân cách bằng dấu phẩy không có khoảng trắng (VD: 'a,b,c' — không phải 'a, b, c').
  • Trả về: Vị trí (1-based) nếu tìm thấy, 0 nếu không tìm thấy, NULL nếu bất kỳ tham số nào là NULL.
  • Phân biệt chữ hoa/thường: Không (case-insensitive) theo collation mặc định.

So sánh với các phương pháp khác

Phương phápƯu điểmNhược điểm
FIND_IN_SET()Đúng ngữ nghĩa CSV, xử lý ranh giới phần tửKhông dùng index, chậm trên bảng lớn
col LIKE '%,val,%'Đơn giảnSai với giá trị đầu/cuối, cần nhiều điều kiện
JSON_CONTAINS() (MySQL 5.7+)Dùng index trên JSON, chuẩn hơnYêu cầu cột kiểu JSON
Bảng liên kết (Normalization)Chuẩn hóa, hiệu năng tốt, toàn vẹn dữ liệuPhức tạp hơn khi thiết kế

Khuyến nghị: Tránh lưu CSV trong cột. Hãy thiết kế bảng trung gian (many-to-many) hoặc dùng kiểu JSON (MySQL 5.7+) để tận dụng index và truy vấn hiệu quả.