Mysql hỗ trợ hai biến thể của trường hợp, biến thể bạn sử dụng trong truy vấn 2 kém linh hoạt hơn nhưng chỉ hỗ trợ bình đẳng trên một biến duy nhất. Phiên bản khác chỉ định không có biến sau trường hợp và sau đó các điều kiện không chỉ cần bằng nhau:
select id_tag,
case
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
from Tags
where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%"
Xem tài liệu để biết thêm chi tiết
CHỈNH SỬA:Đây là giải thích thêm một chút về lý do tại sao truy vấn số 1 của bạn trả lại những gì nó trả về:
Thẻ trường hợpcase tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
mong đợi nhận được một giá trị theo nghĩa đen để so sánh giữa when ... then
Trong trường hợp trên, biểu thức tag LIKE "%class%"
, thẻ tag LIKE "%new%"
và thẻ tag LIKE "%pack%"
tất cả đều được đánh giá trước khi so sánh trường hợp thực tế. Tuy nhiên (!), điều xảy ra là chúng trở thành 0 hoặc 1 và khi được so sánh với giá trị của thẻ, giá trị đầu tiên của 0 sẽ khớp với bất kỳ char nào (char sẽ được chuyển thành 0) - điều này phù hợp với kết quả của truy vấn đầu tiên của bạn.
Đây là một truy vấn hiển thị các giá trị logic cho các biểu thức có liên quan:
select id_tag, tag LIKE "%class%", tag LIKE "%new%", tag = 0, case tag when tag LIKE "%class%" then "class" when tag LIKE "%new%" then "new" when tag LIKE "%pack%" then "pack" end as matching_tag from Tags where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%";
Đó là lý do tại sao bạn nhận được kết quả bất ngờ; CAST im lặng là một cạm bẫy tiêu chuẩn ở đây.