sql >> Database >  >> RDS >> Mysql

CASE in WHERE CLAUSULE in MYSQL

Je bent op de goede weg met je tweede poging, met behulp van logische AND/OR groeperingen in plaats van een CASE , maar als u de voorkeur geeft aan de rij die overeenkomt met cmp_brand over rijen met een lege cmp_brand en verwacht slechts één resultaat terug, structureer uw ORDER BY om de niet-lege cmp_brand . te sorteren en beperk het totale resultaat tot 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

Dit werkt omdat de uitdrukking cmp_brand <> '' evalueert tot de boolean true/false , die MySQL interpreteert als 1/0 . Een aflopende sortering op die waarden dwingt de niet-lege om eerst te sorteren (1 voor 0).

Update na opmerkingen:

Aangezien u de mogelijkheid heeft dat er meer dan één rij wordt geretourneerd, kunt u niet vertrouwen op de ORDER BY . In plaats daarvan kunt u een LEFT JOIN . uitvoeren tegen dezelfde tafel. Zoek aan de ene kant cmp_brand = '' en aan de andere kant overeenkomen met cmp_brand = '123_NIKE' . Belangrijk is dat u de thumb return teruggeeft kolom van beide zijkanten van de join.

Wikkel dat in een subquery in de FROM clausule, dan kun je op het hoogste niveau een SELECT CASE . gebruiken om de voorkeur te geven aan de cmp_brand indien niet leeg.

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. Deelnemen aan kolommen van een ander type?

  2. Update MySQL:java.sql.SQLException:Geen waarde opgegeven voor parameter 8

  3. Invoegen, bij dubbele update in PostgreSQL?

  4. PyMySQL-variabelen in query's