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

SWITCH con LIKE all'interno della query SELECT in MySQL

Mysql supporta due varianti di maiuscole e minuscole, quella che usi nella query 2 è meno flessibile ma supporta solo l'uguaglianza su una singola variabile. L'altra versione non specifica alcuna variabile dopo il caso e quindi le condizioni non devono essere solo l'uguaglianza:

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

Consulta la documentazione per ulteriori dettagli

EDIT:ecco un po' più di spiegazione sul motivo per cui la tua query n. 1 ha restituito ciò che ha restituito:

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

si aspetta di ottenere un valore letterale per il confronto tra when ... then Nel caso precedente le espressioni tag LIKE "%class%" , tag LIKE "%new%" e tag LIKE "%pack%" vengono tutti valutati prima del confronto dei casi effettivi. Tuttavia (!), ciò che accade è che diventano 0 o 1 e quando confrontati con il valore di tag è il primo valore di 0 che corrisponderà a qualsiasi carattere (il carattere verrà lanciato su 0) - questo è coerente con i risultati della tua prima query.

Ecco una query che mostra i valori logici per le espressioni rilevanti:

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

Ecco perché ottieni risultati inaspettati; il CAST silenzioso è una trappola standard qui.