Ответ 1
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%"
Подробнее см. .
EDIT: Здесь немного больше объяснений, почему ваш запроС# 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 - это стандартная ловушка.