Mysql understøtter to varianter af case, den du bruger i forespørgsel 2 er mindre fleksibel, men understøtter kun lighed på en enkelt variabel. Den anden version angiver ingen variabel efter sag, og så behøver betingelser ikke kun at være lighed:
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%"
Se dokumentation for yderligere detaljer
EDIT:Her er en lidt mere forklaring på, hvorfor din forespørgsel #1 returnerede, hvad den returnerede:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
forventer at få en bogstavelig værdi til sammenligning mellem when ... then
I ovenstående tilfælde er udtrykket tag LIKE "%class%"
, tag LIKE "%new%"
og tag LIKE "%pack%"
er alle evalueret før den faktiske case-sammenligning. Men (!), hvad der sker er, at de bliver enten 0 eller 1, og sammenlignet med værdien af tag er det den første værdi af 0, der vil matche enhver char (char vil blive kastet til 0) - dette stemmer overens med resultaterne af din første forespørgsel.
Her er en forespørgsel, der viser de logiske værdier for de relevante udtryk:
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%";
Derfor får du uventede resultater; den tavse CAST er en standard faldgrube her.