Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SWITCH mit LIKE innerhalb der SELECT-Abfrage in MySQL

MySQL unterstützt zwei Varianten der Groß-/Kleinschreibung, die von Ihnen in Abfrage 2 verwendete ist weniger flexibel, unterstützt aber nur Gleichheit bei einer einzelnen Variablen. Die andere Version spezifiziert keine Variable nach case und dann müssen Bedingungen nicht nur Gleichheit sein:

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

Siehe Dokumentation für weitere Details

BEARBEITEN:Hier ist eine weitere Erklärung, warum Ihre Abfrage Nr. 1 zurückgegeben hat, was sie zurückgegeben hat:

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

erwartet einen Literalwert zum Vergleich zwischen when ... then Im obigen Fall tag LIKE "%class%" , tag LIKE "%new%" und tag LIKE "%pack%" werden alle vor dem eigentlichen Fallvergleich ausgewertet. Was jedoch (!) passiert, ist, dass sie entweder 0 oder 1 werden, und wenn sie mit dem Wert von tag verglichen werden, ist es der erste Wert von 0, der mit jedem Zeichen übereinstimmt (char wird umgewandelt). 0) - dies stimmt mit den Ergebnissen Ihrer ersten Abfrage überein.

Hier ist eine Abfrage, die die logischen Werte für die relevanten Ausdrücke zeigt:

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

Deshalb erhalten Sie unerwartete Ergebnisse; Der stille CAST ist hier eine Standardfalle.