sql >> Database teknologi >  >> RDS >> Mysql

CASE i WHERE CLAUSE i MYSQL

Du er på rette vej med dit andet forsøg ved at bruge logiske AND/OR grupperinger i stedet for en CASE , men hvis du vil foretrække rækken, der matcher cmp_brand over rækker med et tomt cmp_brand og forvent kun ét resultat tilbage, strukturer din ORDER BY for at sortere det ikke-tomme cmp_brand først, og begrænse det samlede resultat til 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

Dette virker, fordi udtrykket cmp_brand <> '' evalueres til den boolske true/false , som MySQL fortolker som 1/0 . En faldende sortering på disse værdier tvinger de ikke-tomme til at sortere (1 før 0).

Opdatering efter kommentarer:

Da du har mulighed for at returnere mere end én række, kan du ikke stole på ORDER BY . I stedet kan du udføre en LEFT JOIN mod samme bord. På den ene side skal du matche cmp_brand = '' og på den anden side matcher cmp_brand = '123_NIKE' . Det er vigtigt, at returnere thumb kolonne fra begge sider af sammenføjningen.

Pak det ind i en underforespørgsel i FROM klausul, så på øverste niveau kan du bruge en SELECT CASE at foretrække cmp_brand hvis den ikke er 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. Inkluderer værdier IKKE FUNDET i MySQL-forespørgselsresultater

  2. Kan nogen forklare, hvordan Postgresql-roller, Postgresql-brugere og Linux-brugere relaterer til hinanden?

  3. Hvordan kan jeg vælge posten med den 2. højeste løn i databasen Oracle?

  4. Oracle 12c-installationen kunne ikke få adgang til den midlertidige placering