Mysql ondersteunt twee varianten van hoofdletters, degene die u gebruikt in query 2 is minder flexibel, maar ondersteunt alleen gelijkheid op een enkele variabele. De andere versie specificeert geen variabele na hoofdletters en dan hoeven de voorwaarden niet alleen gelijkheid te zijn:
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%"
Zie documentatie voor meer details
EDIT:Hier is een beetje meer uitleg over waarom uw zoekopdracht #1 heeft opgeleverd wat het heeft opgeleverd:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
verwacht een letterlijke waarde te krijgen voor vergelijking tussen when ... then
In het bovenstaande geval de uitdrukkingen tag LIKE "%class%"
, tag LIKE "%new%"
en tag LIKE "%pack%"
worden allemaal geëvalueerd vóór de feitelijke vergelijking van de hoofdletters. Maar (!), Wat er gebeurt, is dat ze 0 of 1 worden en in vergelijking met de waarde van de tag is het de eerste waarde van 0 die overeenkomt met elke char (char wordt gecast naar 0) - dit komt overeen met de resultaten van uw eerste zoekopdracht.
Hier is een query die de logische waarden voor de relevante expressies toont:
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%";
Daarom krijg je onverwachte resultaten; de stille CAST is hier een standaard valkuil.