sql >> Database teknologi >  >> RDS >> Mysql

SWITCH med LIKE inde i SELECT-forespørgsel i MySQL

Mysql understøtter to varianter af case, den du bruger i forespørgsel 2 er mindre fleksibel, men understøtter kun lighed på en enkelt variabel. Den anden version angiver ingen variabel efter sag, og så behøver betingelser ikke kun at være lighed:

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 for yderligere detaljer

EDIT:Her er en lidt mere forklaring på, hvorfor din forespørgsel #1 returnerede, hvad den returnerede:

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

forventer at få en bogstavelig værdi til sammenligning mellem when ... then I ovenstående tilfælde er udtrykket tag LIKE "%class%" , tag LIKE "%new%" og tag LIKE "%pack%" er alle evalueret før den faktiske case-sammenligning. Men (!), hvad der sker er, at de bliver enten 0 eller 1, og sammenlignet med værdien af ​​tag er det den første værdi af 0, der vil matche enhver char (char vil blive kastet til 0) - dette stemmer overens med resultaterne af din første forespørgsel.

Her er en forespørgsel, der viser de logiske værdier for de relevante udtryk:

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

Derfor får du uventede resultater; den tavse CAST er en standard faldgrube her.



  1. Brug af markører til at søge i PostgreSQL

  2. PHP MySQL indsætter data til flere tabeller

  3. Sådan fungerer Asinh() i PostgreSQL

  4. Kontroller, om rækken findes i databasen, før du indsætter