sql >> Databáze >  >> RDS >> Mysql

CASE in WHERE CLAUSE v MYSQL

Při druhém pokusu jste na správné cestě pomocí logického AND/OR seskupení namísto CASE , ale pokud chcete preferovat řádek odpovídající cmp_brand přes řádky s prázdnou značkou cmp_brand a očekávejte zpět pouze jeden výsledek, strukturujte svůj ORDER BY seřadit neprázdný cmp_brand nejprve a omezte celkový výsledek na 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

Funguje to, protože výraz cmp_brand <> '' vyhodnotí jako logickou hodnotu true/false , kterou MySQL interpretuje jako 1/0 . Sestupné řazení těchto hodnot přinutí neprázdné, aby se seřadily jako první (1 před 0).

Aktualizace po komentářích:

Protože máte možnost vrátit více než jeden řádek, nemůžete se spoléhat na ORDER BY . Místo toho můžete provést LEFT JOIN proti stejnému stolu. Na jedné straně musí odpovídat cmp_brand = '' a na druhé straně odpovídá cmp_brand = '123_NIKE' . Důležité je vrátit thumb sloupec z oba strany spojení.

Zabalte to do poddotazu v FROM klauzuli, pak na nejvyšší úrovni můžete použít SELECT CASE preferovat značku cmp_brand pokud není prázdný.

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. Seznámení s pracovní zátěží SQL Serveru

  2. změnit sloupec přejmenování tabulky v databázi Oracle

  3. Mysql, kde 1=0 záměna

  4. Složený dotaz na pole JSONB v Postgresu?