sql >> Databasteknik >  >> RDS >> Mysql

CASE i WHERE CLAUSE i MYSQL

Du är på rätt väg med ditt andra försök med logiska AND/OR grupperingar istället för en CASE , men om du vill föredra raden som matchar cmp_brand över rader med ett tomt cmp_brand och förvänta dig bara ett resultat tillbaka, strukturera din ORDER BY för att sortera det icke-tomma cmp_brand först och begränsa det totala resultatet till 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

Detta fungerar eftersom uttrycket cmp_brand <> '' utvärderas till det booleska true/false , som MySQL tolkar som 1/0 . En fallande sortering på dessa värden tvingar de icke-tomma att sortera (1 före 0).

Uppdatering efter kommentarer:

Eftersom du har möjlighet att returnera mer än en rad kan du inte lita på ORDER BY . Istället kan du utföra en LEFT JOIN mot samma bord. På ena sidan, matcha cmp_brand = '' och på andra sidan matchar cmp_brand = '123_NIKE' . Viktigt, returnera thumb kolumn från båda sidorna av sammanfogningen.

Slå in det i en underfråga i FROM sats, sedan kan du på översta nivån använda en SELECT CASE för att föredra cmp_brand om den inte är tom.

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. Hur ändrar man PostgreSQL användarlösenord?

  2. Hur jämför jag indata med mysql-data med php/sql?

  3. Uppdatera n slumpmässiga rader i SQL

  4. vb.net-fråga för att visa specifika rader av datatabeller [grundläggande]