Mysql obsługuje dwa warianty przypadku, ten, którego używasz w zapytaniu 2, jest mniej elastyczny, ale obsługuje tylko równość na jednej zmiennej. Druga wersja nie określa żadnej zmiennej po przypadku, a wtedy warunki nie muszą być tylko równością:
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%"
Zobacz dokumentację więcej szczegółów
EDYCJA:Oto nieco więcej wyjaśnień, dlaczego Twoje zapytanie nr 1 zwróciło to, co zwróciło:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
oczekuje, że otrzyma wartość dosłowną do porównania między when ... then
W powyższym przypadku wyrażenia tag LIKE "%class%"
, tag LIKE "%new%"
i tag LIKE "%pack%"
wszystkie są oceniane przed rzeczywistym porównaniem przypadków. Jednak (!) dzieje się tak, że stają się one 0 lub 1, a po porównaniu z wartością tagu jest to pierwsza wartość 0, która będzie pasować do dowolnego znaku (char zostanie rzutowany na 0) — jest to zgodne z wynikami Twojego pierwszego zapytania.
Oto zapytanie, które pokazuje wartości logiczne dla odpowiednich wyrażeń:
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%";
Dlatego otrzymujesz nieoczekiwane wyniki; cichy CAST jest tutaj standardową pułapką.