Mysql admite dos variantes del caso, la que usa en la consulta 2 es menos flexible pero solo admite la igualdad en una sola variable. La otra versión no especifica ninguna variable después del caso y luego las condiciones no necesitan ser solo igualdad:
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%"
Consulte la documentación para más detalles
EDITAR:aquí hay una explicación un poco más sobre por qué su consulta n. ° 1 devolvió lo que devolvió:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
espera obtener un valor literal para la comparación entre when ... then
En el caso anterior, las expresiones tag LIKE "%class%"
, tag LIKE "%new%"
y tag LIKE "%pack%"
todos se evalúan antes de la comparación real del caso. Sin embargo (!), lo que sucede es que se convierten en 0 o 1 y cuando se comparan con el valor de la etiqueta, es el primer valor de 0 que coincidirá con cualquier carácter (el carácter se convertirá en 0) - esto es consistente con los resultados de su primera consulta.
Aquí hay una consulta que muestra los valores lógicos para las expresiones relevantes:
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%";
Por eso obtienes resultados inesperados; el CAST silencioso es una trampa estándar aquí.