Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PRZYPADEK w KLAUZULI WHERE w MYSQL

Jesteś na dobrej drodze przy drugiej próbie, używając logicznego AND/OR grupowanie zamiast CASE , ale jeśli chcesz preferować wiersz pasujący do cmp_brand nad wierszami z pustym cmp_brand i spodziewaj się tylko jednego wyniku, ustrukturyzuj swoje ORDER BY aby posortować niepuste cmp_brand najpierw i ogranicz ogólny wynik do 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

Działa to, ponieważ wyrażenie cmp_brand <> '' zwraca wartość logiczną true/false , który MySQL interpretuje jako 1/0 . Sortowanie malejące według tych wartości zmusza niepuste do sortowania od pierwszej (1 przed 0).

Aktualizacja po komentarzach:

Ponieważ masz możliwość zwrócenia więcej niż jednego wiersza, nie możesz polegać na ORDER BY . Zamiast tego możesz wykonać LEFT JOIN przeciwko tej samej tabeli. Z jednej strony dopasuj cmp_brand = '' a po drugiej stronie dopasuj cmp_brand = '123_NIKE' . Co ważne, zwróć thumb kolumna z obu boki połączenia.

Zapakuj to w podzapytanie w FROM klauzula, to na najwyższym poziomie możesz użyć SELECT CASE preferować cmp_brand jeśli nie jest pusty.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można użyć klauzuli WHERE do zaznaczenia wszystkich rekordów w instrukcji SQL?

  2. Jak przechowywać pustą wartość jako pole całkowite?

  3. Pomoc w kodzie SQL do znalezienia najnowszego rekordu na podstawie ID

  4. MySQL prawidłowo porównujący i wykluczający wyniki

  5. SQL self-join table usuń zduplikowane wiersze