Comment puis-je l'utiliser correctement les CAS..QUAND dans MySQL
Voici une démo de la requête, un avis c'est très simple, Récupère seulement où prix_de_base est de 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 l'exécuter sur ma DB, j'obtiens:
3 0
3 0
3 0
3 0
3 0
- donc sa prise 3 u veux dire.. ?
- oui, étrange, non?
- Pas vraiment. Ce que vous avez fait est équivalent à quelque chose comme
switch (x) { case (x==0): ... case (x<5): ... case (x>5): ... }
en C. Vous êtes de mélange des approches et il est à l'origine des comportements inattendus.
Vous devez vous connecter pour publier un commentaire.
Supprimer la
course_enrollment_settings.base_price
immédiatement aprèsCASE
:CASE
a deux formes différentes, comme détaillé dans le manuel. Ici, vous voulez la deuxième forme depuis que vous utilisez conditions de recherche.Ou:
ici AFFAIRE est une expression de la 2e scénario search_condition permettra d'évaluer et, si aucune search_condition est égal, puis d'exécuter d'autre
devrait être
[
et]
CASE course_enrollment_settings.base_price
est faux, il doit être justeCASE
Quelques explications. L'original de votre requête sera exécutée comme :
c'est pourquoi vous obtenez toujours 3
AS 'calc_base_price
. Je l'ai résolu en ajoutant des parenthèses autour de l'ensemble de la(CASE ... END)
Il y a deux variantes de
CAS
, et vous ne l'utilisez pas celui que vous pensez que vous êtes.Ce que vous faites
Chaque condition est approximativement équivalent à un
if (case_value == when_value)
(pseudo-code).Cependant, vous avez mis toute une condition
when_value
, conduisant à quelque chose comme:Maintenant,
(case_value > 100)
évalue àFALSE
, et est le seul de vos conditions pour le faire. Ainsi, vous avez maintenant:FALSE
convertit à0
et, grâce à la naissance de la pleine expressionif (case_value == 0)
vous pouvez maintenant voir pourquoi la troisième condition incendies.Ce que vous êtes censé faire
Chute de la première
course_enrollment_settings
de sorte qu'il n'y a pascase_value
, provoquant MySQL de savoir que vous avez l'intention d'utiliser la deuxième variante de laCASE
:Maintenant, vous pouvez fournir vos instructions conditionnelles comme
search_condition
.Aussi, merci de lire la documentation pour les fonctionnalités que vous utilisez.
Je pense qu'en partie, c'est que vous êtes en indiquant que la valeur que vous sélectionnez après
CASE
, puis à l'aide deWHEN x = y
de la syntaxe par la suite, qui est une combinaison de deux méthodes différentes de l'aideCASE
. Il devrait êtreou