web-dev-qa-db-fra.com

Comment utiliser correctement CASE..WHEN dans MySQL

Voici une requête de démonstration, notez que c'est très simple, ne récupère que lorsque base_price vaut 0, et encore, il choisit la condition 3:

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    WHEN course_enrollment_settings.base_price<101      THEN 2
    WHEN course_enrollment_settings.base_price>100 AND   
                      course_enrollment_settings.base_price<201 THEN 3
        ELSE 6
   END AS 'calc_base_price',
   course_enrollment_settings.base_price
FROM
    course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0

base_price Est decimal(8,0)

Lorsque je lance ceci sur ma base de données, je reçois:

3 0
3 0
3 0
3 0
3 0

56

Retirer le course_enrollment_settings.base_price immédiatement après CASE:

SELECT
   CASE
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    ...
    END

CASE a deux formes différentes, comme détaillé dans le manuel . Ici, vous voulez le second formulaire puisque vous utilisez les conditions de recherche .

55
NPE
CASE case_value
    WHEN when_value THEN statements
    [WHEN when_value THEN statements]
    ELSE statements
END 

Ou:

CASE
WHEN <search_condition> THEN statements
[WHEN <search_condition> THEN statements] 
ELSE statements
END 

ici CASE est une expression dans le second scénario, search_condition va évaluer et si aucun critère_recherche n'est égal, alors exécutez autre chose.

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1

devrait être

SELECT
   CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1
32
kapil das

CASE course_enrollment_settings.base_price est faux ici, cela devrait être juste CASE

SELECT 
CASE 
WHEN course_enrollment_settings.base_price = 0      THEN 1 
WHEN course_enrollment_settings.base_price<101      THEN 2 
WHEN course_enrollment_settings.base_price>100 AND    
                  course_enrollment_settings.base_price<201 THEN 3 
    ELSE 6 
END AS 'calc_base_price', 
course_enrollment_settings.base_price 
FROM 
  course_enrollment_settings 
WHERE course_enrollment_settings.base_price = 0 

Quelques explications Votre requête initiale sera exécutée comme suit:

SELECT 
CASE 0
WHEN 0=0 THEN 1 -- condition evaluates to 1, then 0 (from CASE 0)compares to 1 - false
WHEN 0<1 THEN 2 -- condition evaluates to 1,then 0 (from CASE 0)compares to 1 - false
WHEN 0>100 and 0<201 THEN 3 -- evaluates to 0 ,then 0 (from CASE 0)compares to 0 - true
ELSE 6, ...

c'est pourquoi vous obtenez toujours 3

11
a1ex07
SELECT
   CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    WHEN course_enrollment_settings.base_price>0 AND  
         course_enrollment_settings.base_price<=100     THEN 2
    WHEN course_enrollment_settings.base_price>100 AND   
         course_enrollment_settings.base_price<201      THEN 3
        ELSE 6
   END AS 'calc_base_price',
   course_enrollment_settings.base_price
FROM
    course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0
5
Teja

Il y a deux variantes de CASE , et vous n'utilisez pas celle que vous pensez être.

Que fais tu

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

Chaque condition est vaguement équivalente à un if (case_value == when_value) (pseudo-code).

Cependant, vous avez mis une condition entière sous la forme when_value, Ce qui conduit à quelque chose comme:

if (case_value == (case_value > 100))

Maintenant, (case_value > 100) Est évalué à FALSE et est la seule de vos conditions pour le faire. Alors maintenant vous avez:

if (case_value == FALSE)

FALSE est converti en 0 et, grâce à l'expression complète résultante if (case_value == 0), vous pouvez maintenant voir pourquoi la troisième condition est déclenchée.

Ce que vous êtes censé faire

Supprimez le premier course_enrollment_settings Pour qu'il n'y ait pas de case_value, Ce qui permettra à MySQL de savoir que vous avez l'intention d'utiliser la deuxième variante de CASE:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

Vous pouvez maintenant fournir vos conditions complètes sous la forme search_condition.

Lisez également la documentation relative aux fonctionnalités que vous utilisez.

Je pense en partie que vous indiquez la valeur que vous sélectionnez après CASE, puis que vous utilisez WHEN x = y la syntaxe suivante, qui combine deux méthodes différentes d’utilisation de CASE. Il devrait être soit

CASE X
  WHEN a THEN ...
  WHEN b THEN ...

ou

CASE
  WHEN x = a THEN ...
  WHEN x = b THEN ...
1
Kaji