Mysql
 sql >> база данни >  >> RDS >> Mysql

CASE в WHERE CLAUSE в MYSQL

Вие сте на прав път с втория си опит, използвайки логическо AND/OR групирания вместо CASE , но ако искате предпочитате редът, съответстващ на cmp_brand върху редове с празен cmp_brand и очаквайте само един резултат обратно, структурирайте своя ORDER BY за сортиране на непразния cmp_brand първо и ограничете общия резултат до 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

Това работи, защото изразът cmp_brand <> '' дава булево значение true/false , което MySQL интерпретира като 1/0 . Низходящо сортиране на тези стойности принуждава непразните да сортират първо (1 преди 0).

Актуализация след коментари:

Тъй като имате възможността да върнете повече от един ред, не можете да разчитате на ORDER BY . Вместо това можете да извършите LEFT JOIN срещу същата маса. От едната страна съвпадайте с cmp_brand = '' а от другата страна съответства на cmp_brand = '123_NIKE' . Важно е да върнете thumb колона от и двете страни на съединението.

Увийте това в подзаявка в FROM клауза, тогава на най-високо ниво можете да използвате SELECT CASE да предпочетете cmp_brand ако не е празно.

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. Base64 кодиран низ за просто sql инжектиране

  2. Грешка при свързване - SQLSTATE[HY000] [2002] Операцията изтече

  3. Как да получите структура на базата данни в MySQL чрез заявка

  4. Грешка в MySql:Не може да се актуализира таблицата в съхранената функция/тригера

  5. Как да изберете последния запис от MySQL таблицата с помощта на SQL синтаксис, ако е изпълнено само условие