Mysql stöder två varianter av fall, den du använder i fråga 2 är mindre flexibel men stöder bara likhet på en enda variabel. Den andra versionen specificerar ingen variabel efter fall och då behöver villkoren inte bara vara likhet:
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 för ytterligare information
EDIT:Här är lite mer förklaring om varför din fråga #1 returnerade vad den returnerade:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
förväntar sig att få ett bokstavligt värde för jämförelse mellan when ... then
I ovanstående fall uttrycken tag LIKE "%class%"
, tag LIKE "%new%"
och tag LIKE "%pack%"
utvärderas alla före den faktiska falljämförelsen. Men (!), vad som händer är att de blir antingen 0 eller 1 och jämfört med värdet på taggen är det det första värdet på 0 som matchar alla char (char kommer att kastas till 0) - detta överensstämmer med resultaten av din första fråga.
Här är en fråga som visar de logiska värdena för de relevanta uttrycken:
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%";
Det är därför du får oväntade resultat; den tysta CAST är en vanlig fallgrop här.