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
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 .
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
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
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
Il y a deux variantes de CASE
, et vous n'utilisez pas celle que vous pensez être.
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.
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 ...