sql >> Base de Datos >  >> RDS >> Mysql

CASO en CLÁUSULA DONDE en MYSQL

Estás en el camino correcto con tu segundo intento, usando AND/OR lógico agrupaciones en lugar de un CASE , pero si quieres preferir la fila que coincide con cmp_brand sobre filas con un cmp_brand vacío y espera solo un resultado, estructura tu ORDER BY para ordenar el cmp_brand no vacío primero, y limite el resultado general 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

Esto funciona porque la expresión cmp_brand <> '' evalúa al booleano true/false , que MySQL interpreta como 1/0 . Una ordenación descendente en esos valores obliga a los que no están vacíos a ordenar primero (1 antes de 0).

Actualizar después de los comentarios:

Dado que tiene la posibilidad de que se devuelva más de una fila, no puede confiar en ORDER BY . En su lugar, puede realizar un LEFT JOIN contra la misma mesa. Por un lado, haga coincidir cmp_brand = '' y en el otro lado coincide con cmp_brand = '123_NIKE' . Es importante destacar que devuelve el thumb columna de ambos lados de la unión.

Envuelva eso en una subconsulta en FROM cláusula, luego en el nivel superior puede usar un SELECT CASE preferir el cmp_brand si no está vacío.

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