Mysql mendukung dua varian kasus, yang Anda gunakan dalam kueri 2 kurang fleksibel tetapi hanya mendukung kesetaraan pada satu variabel. Versi lain tidak menentukan variabel setelah kasus dan kemudian kondisi tidak perlu hanya kesetaraan:
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%"
Lihat dokumentasi untuk keterangan lebih lanjut
EDIT:Inilah sedikit penjelasan lebih lanjut tentang mengapa kueri Anda #1 mengembalikan apa yang dikembalikan:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
mengharapkan untuk mendapatkan nilai literal untuk perbandingan antara when ... then
Dalam kasus di atas ekspresi tag LIKE "%class%"
, tag LIKE "%new%"
dan tag LIKE "%pack%"
semuanya dievaluasi sebelum perbandingan kasus yang sebenarnya. Namun (!), apa yang terjadi adalah bahwa mereka menjadi 0 atau 1 dan bila dibandingkan dengan nilai tag itu adalah nilai pertama 0 yang akan cocok dengan karakter apa pun (char akan dilemparkan ke 0) - ini konsisten dengan hasil kueri pertama Anda.
Berikut adalah kueri yang menunjukkan nilai logika untuk ekspresi yang relevan:
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%";
Itu sebabnya Anda mendapatkan hasil yang tidak terduga; CAST diam adalah perangkap standar di sini.