Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CASE in WHERE-KLAUSELN in MYSQL

Beim zweiten Versuch mit dem logischen AND/OR sind Sie auf dem richtigen Weg Gruppierungen anstelle eines CASE , aber wenn Sie bevorzugen möchten die Zeile, die cmp_brand entspricht über Zeilen mit einem leeren cmp_brand und nur ein Ergebnis zurück erwarten, strukturieren Sie Ihr ORDER BY um den nicht leeren cmp_brand zu sortieren zuerst und begrenzen Sie das Gesamtergebnis auf 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

Das funktioniert, weil der Ausdruck cmp_brand <> '' wertet den booleschen Wert true/false aus , die MySQL als 1/0 interpretiert . Eine absteigende Sortierung nach diesen Werten zwingt die nicht leeren, zuerst zu sortieren (1 vor 0).

Update nach Kommentaren:

Da Sie die Möglichkeit haben, dass mehr als eine Zeile zurückgegeben wird, können Sie sich nicht auf ORDER BY verlassen . Stattdessen können Sie einen LEFT JOIN ausführen gegen denselben Tisch. Passen Sie auf der einen Seite cmp_brand = '' an und auf der anderen Seite übereinstimmen cmp_brand = '123_NIKE' . Geben Sie unbedingt den thumb zurück Spalte von beiden Seiten der Verbindung.

Schließen Sie das in eine Unterabfrage im FROM ein -Klausel, dann können Sie auf der obersten Ebene einen SELECT CASE verwenden um cmp_brand zu bevorzugen falls nicht leer.

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