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

Tìm số nguyên trong chuỗi dữ liệu phân cách bằng dấu phẩy trong MySQL

Khi cột lưu nhiều số phân cách bằng dấu phẩy (CSV), dùng LIKE với pattern %gia_tri% có thể tìm kiếm, nhưng dễ cho kết quả sai (false positive) do khớp chuỗi con.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu:

CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    DoubleValue VARCHAR(20)
);
INSERT INTO DemoTable (DoubleValue) VALUES 
('80.2,90.5,88.90'), ('78.56,45.80,88,45.6'), ('12.34,90.06,89.90');

Tìm chuỗi chứa "80":

SELECT * FROM DemoTable WHERE DoubleValue LIKE '%80%';

Kết quả (có false positive)

IdDoubleValue
180.2,90.5,88.90
278.56,45.80,88,45.6

→ Hàng 2 khớp do chứa 45.80 và 88 (chứa "80" trong "45.80").

Cách chính xác hơn: REGEXP với ranh giới

MySQL 8.0+ hỗ trợ REGEXP với ranh biên từ [[:<:]] và [[:>:]] (word boundary):

SELECT * FROM DemoTable 
WHERE DoubleValue REGEXP '[[:<:]]80[[:>:]]';

Hoặc dùng pattern pipe-delimited (nếu dữ liệu chuẩn):

WHERE CONCAT(',', DoubleValue, ',') LIKE '%,80,%'

⚠️ Khuyến nghị thiết kế

Lưu trữ CSV trong một cột vi phạm chuẩn 1NF. Nên tách thành bảng con:

CREATE TABLE DemoTable_Values (
    id INT AUTO_INCREMENT PRIMARY KEY,
    parent_id INT,
    value DECIMAL(10,2),
    FOREIGN KEY (parent_id) REFERENCES DemoTable(Id)
);

Khi đó tìm kiếm chính xác, index hiệu quả, không lo false positive:

SELECT DISTINCT parent_id FROM DemoTable_Values WHERE value = 80;