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

MYSQLのWHERECLAUSEのケース

    論理的なAND/ORを使用して、2回目の試行で正しい方向に進んでいます。 CASEの代わりにグループ化 、ただし、優先したい場合 cmp_brandに一致する行 cmp_brandが空の行 結果が1つだけ返されることを期待して、ORDER BYを構成します 空でないcmp_brandを並べ替える まず、全体の結果を1に制限します。

    SELECT thumb 
    FROM inf_brand_images 
    WHERE
      is_active=1 AND 
      ((cmp_brand = '' AND brand='NIKE') OR (cmp_brand='123_NIKE'))
    /* non-empty cmp_brand will sort first */
    ORDER BY cmp_brand <> '' DESC
    /* and the end result is limited only to the first sorted row
       which will be the cmp_brand if matched, or the brand otherwise */
    LIMIT 1
    

    http://sqlfiddle.com/#!2/d176b/2

    これが機能するのは、式cmp_brand <> '' ブール値のtrue/falseに評価されます 、MySQLは1/0として解釈します 。これらの値を降順で並べ替えると、空でない値は最初に並べ替えられます(0の前に1)。

    コメント後に更新:

    複数の行が返される可能性があるため、ORDER BYに依存することはできません。 。代わりに、LEFT JOINを実行できます 同じテーブルに対して。一方では、cmp_brand = ''と一致します 反対側ではcmp_brand = '123_NIKE'と一致します 。重要なのは、thumbを返すことです 両方の列 結合の側面。

    FROMのサブクエリでそれをラップします 句を入力すると、トップレベルでSELECT CASEを使用できます cmp_brandを優先する 空でない場合。

    SELECT DISTINCT
      CASE WHEN cbcb IS NOT NULL THEN cbthumb ELSE bthumb END AS thumb
    FROM (
      /* Return thumbs from both sides of the join */
      SELECT 
        b.thumb AS bthumb,
        b.cmp_brand AS bcb,
        cb.thumb AS cbthumb,
        cb.cmp_brand AS cbcb
      FROM
        inf_brand_images b
        /* join the table against itself with the matching cmp_brand in the join condition */
        LEFT JOIN inf_brand_images cb
          ON b.brand = cb.brand
          AND cb.cmp_brand = '123_NIKE'
      WHERE 
        /* The WHERE clause looks for empty cmp_brand on the left side of the join */
        b.brand = 'NIKE' AND b.cmp_brand = ''
    ) thumbs
    



    1. ポート5432がブロックされている場合のリモートサーバーからのpg_dumppostgresデータベース

    2. MySQLコマンドラインクライアントでのオートコンプリート

    3. EEE MMM dd HH:mm:ssZZZyyyy日付形式からjava.sql.Dateへ

    4. 最適化する必要があるQueryでのGroupbyの奇妙な動作