Mysqlはcaseの2つのバリアントをサポートします。クエリ2で使用するものは柔軟性が低くなりますが、単一の変数での等式のみをサポートします。他のバージョンでは、大文字と小文字の後に変数を指定しないため、条件は等しいだけである必要はありません:
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%"
ドキュメント を参照してください。 詳細については
編集:クエリ#1が返されたものを返した理由についてもう少し説明します:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
when ... then
を比較するためのリテラル値を取得することを期待しています 上記の場合、式tag LIKE "%class%"
、tag LIKE "%new%"
およびtag LIKE "%pack%"
すべて実際のケース比較の前に評価されます。ただし、(!)は、0または1になり、tagの値と比較すると、任意のcharに一致する最初の0の値になります(charはにキャストされます) 0)-これは最初のクエリの結果と一致しています。
関連する式の論理値を示すクエリは次のとおりです。
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%";
そのため、予期しない結果が得られます。サイレントキャストは、ここでの標準的な落とし穴です。