sql >> Base de Datos >  >> RDS >> Mysql

CAMBIAR con LIKE dentro de la consulta SELECT en MySQL

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í.