Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SWITCH com LIKE dentro da consulta SELECT no MySQL


O MySQL suporta duas variantes de maiúsculas e minúsculas, a que você usa na consulta 2 é menos flexível, mas suporta apenas igualdade em uma única variável. A outra versão não especifica nenhuma variável após o caso e as condições não precisam ser apenas igualdade:
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 a documentação para mais detalhes

EDIT:Aqui está um pouco mais de explicação sobre por que sua consulta nº 1 retornou o que retornou:
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 obter um valor literal para comparação entre when ... then No caso acima as expressões tag LIKE "%class%" , tag LIKE "%new%" e tag LIKE "%pack%" são todos avaliados antes da comparação de caso real. No entanto (!), o que acontece é que eles se tornam 0 ou 1 e quando comparados com o valor da tag é o primeiro valor de 0 que corresponderá a qualquer char (char será convertido para 0) - isso é consistente com os resultados da sua primeira consulta.

Aqui está uma consulta que mostra os valores lógicos para as expressões 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 isso que você obtém resultados inesperados; o CAST silencioso é uma armadilha padrão aqui.