sql >> Databasteknik >  >> RDS >> Mysql

SWITCH med LIKE inuti SELECT-frågan i MySQL

Mysql stöder två varianter av fall, den du använder i fråga 2 är mindre flexibel men stöder bara likhet på en enda variabel. Den andra versionen specificerar ingen variabel efter fall och då behöver villkoren inte bara vara likhet:

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

Se dokumentation för ytterligare information

EDIT:Här är lite mer förklaring om varför din fråga #1 returnerade vad den returnerade:

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

förväntar sig att få ett bokstavligt värde för jämförelse mellan when ... then I ovanstående fall uttrycken tag LIKE "%class%" , tag LIKE "%new%" och tag LIKE "%pack%" utvärderas alla före den faktiska falljämförelsen. Men (!), vad som händer är att de blir antingen 0 eller 1 och jämfört med värdet på taggen är det det första värdet på 0 som matchar alla char (char kommer att kastas till 0) - detta överensstämmer med resultaten av din första fråga.

Här är en fråga som visar de logiska värdena för de relevanta uttrycken:

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

Det är därför du får oväntade resultat; den tysta CAST är en vanlig fallgrop här.



  1. PostgreSQL versionskontroll med Atlassian Bitbucket

  2. MySQL:Gruppera efter och räkna flera fält

  3. Det gick inte att hitta konverteringsfunktionen från okänd till text

  4. Bästa DBaaS-lösning för MySQL