sql >> データベース >  >> RDS >> Mysql

MySQLのSELECTクエリ内でLIKEを使用してSWITCH

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

    そのため、予期しない結果が得られます。サイレントキャストは、ここでの標準的な落とし穴です。



    1. データベースのすべての行をハッシュ値で更新します

    2. csvデータをmysqlにインポートするためのPHPスクリプト

    3. Laravel5.1-2列で並べ替えて意図したとおりに機能しない

    4. MySQLの現在のタイムゾーンを取得するにはどうすればよいですか?