Mysql поддържа два варианта на регистри, този, който използвате в заявка 2, е по-малко гъвкав, но поддържа само равенство на една променлива. Другата версия не посочва променлива след случай и тогава условията не трябва да са само равенство:
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%"
Вижте документацията за повече подробности
РЕДАКТИРАНЕ:Ето малко повече обяснение защо вашата заявка №1 е върнала това, което е върнала:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
очаква да получи буквална стойност за сравнение между when ... then
В горния случай изразите tag LIKE "%class%"
, tag LIKE "%new%"
и tag LIKE "%pack%"
всички се оценяват преди действителното сравнение на случаите. Въпреки това (!), това, което се случва е, че те стават или 0, или 1 и когато се сравняват със стойността на маркера, първата стойност на 0 ще съответства на всеки char (char ще бъде прехвърлен на 0) – това е в съответствие с резултатите от първата ви заявка.
Ето заявка, която показва логическите стойности за съответните изрази:
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%";
Ето защо получавате неочаквани резултати; безшумното CAST е стандартен капан тук.