Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

CASE em WHERE CLAUSE no MYSQL


Você está no caminho certo com sua segunda tentativa, usando a lógica AND/OR agrupamentos em vez de um CASE , mas se você quiser preferir a linha correspondente a cmp_brand sobre as linhas com um cmp_brand vazio e esperar apenas um resultado de volta, estruture seu ORDER BY para classificar o cmp_brand não vazio primeiro e limite o resultado geral 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

Isso funciona porque a expressão cmp_brand <> '' avalia para o booleano true/false , que o MySQL interpreta como 1/0 . Uma classificação decrescente nesses valores força os não vazios a classificar primeiro (1 antes de 0).

Atualização após comentários:


Como você tem a possibilidade de mais de uma linha ser retornada, você não pode confiar no ORDER BY . Em vez disso, você pode executar um LEFT JOIN contra a mesma mesa. De um lado, combine cmp_brand = '' e do outro lado corresponde a cmp_brand = '123_NIKE' . Importante, retorne o thumb coluna de ambos lados da junção.

Envolva isso em uma subconsulta no FROM cláusula, então no nível superior você pode usar um SELECT CASE preferir o cmp_brand se não estiver vazio.
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