Mysql
 sql >> Base de données >  >> RDS >> Mysql

SWITCH avec LIKE dans la requête SELECT dans MySQL

Mysql supporte deux variantes de casse, celle que vous utilisez dans la requête 2 est moins flexible mais ne supporte que l'égalité sur une seule variable. L'autre version ne spécifie aucune variable après le cas et les conditions n'ont pas besoin d'être uniquement l'égalité :

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%"

Voir la documentation pour plus de détails

EDIT :Voici un peu plus d'explications sur la raison pour laquelle votre requête n° 1 a renvoyé ce qu'elle a renvoyé :

case tag
   when tag LIKE "%class%" then "class" 
   when tag LIKE "%new%" then "new"
   when tag LIKE "%pack%" then "pack"
end as matching_tag

s'attend à obtenir une valeur littérale pour la comparaison entre when ... then Dans le cas ci-dessus, les expressions tag LIKE "%class%" , tag LIKE "%new%" et tag LIKE "%pack%" sont tous évalués avant la comparaison de cas réelle. Cependant (!), Ce qui se passe, c'est qu'ils deviennent 0 ou 1 et lorsqu'ils sont comparés à la valeur de tag, c'est la première valeur de 0 qui correspondra à n'importe quel caractère (char sera converti en 0) - ceci est cohérent avec les résultats de votre première requête.

Voici une requête qui affiche les valeurs logiques des expressions pertinentes :

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%";

C'est pourquoi vous obtenez des résultats inattendus; le CAST silencieux est un piège standard ici.