Mysql
 sql >> Database >  >> RDS >> Mysql

CASO in CLAUSOLA WHERE in MYSQL

Sei sulla strada giusta con il tuo secondo tentativo, utilizzando AND/OR logico raggruppamenti invece di un CASE , ma se vuoi preferire la riga corrispondente a cmp_brand su righe con un cmp_brand vuoto e aspettati un solo risultato, struttura il tuo ORDER BY per ordinare il cmp_brand non vuoto prima e limita il risultato complessivo a 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

Funziona perché l'espressione cmp_brand <> '' restituisce il booleano true/false , che MySQL interpreta come 1/0 . Un ordinamento decrescente su quei valori costringe quelli non vuoti a ordinare il pugno (1 prima di 0).

Aggiorna dopo i commenti:

Dal momento che hai la possibilità di restituire più di una riga, non puoi fare affidamento su ORDER BY . Invece, puoi eseguire un LEFT JOIN contro lo stesso tavolo. Su un lato, abbina cmp_brand = '' e dall'altro lato abbina cmp_brand = '123_NIKE' . Importante, restituisci il thumb colonna da entrambi lati dell'unione.

Inseriscilo in una sottoquery nel FROM clausola, quindi al livello più alto puoi usare un SELECT CASE preferire il cmp_brand se non vuoto.

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