Hier ist eine Demo-Abfrage. Beachten Sie, dass sie sehr einfach ist. Ruft nur ab, wenn base_price 0 ist. Und wählt dennoch die Bedingung 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
ist decimal(8,0)
Wenn ich dies auf meiner Datenbank ausführe, erhalte ich:
3 0
3 0
3 0
3 0
3 0
mysql
sql
conditional
switch-statement
case
Itay Moav-Malimovka
quelle
quelle
CASE case_value WHEN when_value THEN statements [WHEN when_value THEN statements] ELSE statements END
Oder:
CASE WHEN <search_condition> THEN statements [WHEN <search_condition> THEN statements] ELSE statements END
Hier ist CASE ein Ausdruck im 2. Szenario. search_condition wird ausgewertet. Wenn keine search_condition gleich ist, führen Sie else aus
SELECT CASE course_enrollment_settings.base_price WHEN course_enrollment_settings.base_price = 0 THEN 1
sollte sein
SELECT CASE WHEN course_enrollment_settings.base_price = 0 THEN 1
quelle
[
und]
CASE course_enrollment_settings.base_price
ist hier falsch, es sollte gerecht seinCASE
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
Einige Erklärungen. Ihre ursprüngliche Abfrage wird ausgeführt als:
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, ...
deshalb bekommst du immer 3
quelle
AS 'calc_base_price
. Ich löste es, indem ich Klammern um das Ganze hinzufügte(CASE ... END)
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
quelle
Es gibt zwei Varianten von
CASE
, und Sie verwenden nicht die, von der Sie glauben, dass Sie sie sind.Was tust du
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE
Jede Bedingung entspricht lose einem
if (case_value == when_value)
(Pseudocode).Sie haben jedoch eine ganze Bedingung als gesetzt
when_value
, was zu etwas führt wie:Jetzt
(case_value > 100)
bewertetFALSE
und ist die einzige Ihrer Bedingungen, um dies zu tun. Jetzt haben Sie also:FALSE
Konvertiert in0
und durch den resultierenden vollständigen Ausdruck könnenif (case_value == 0)
Sie jetzt sehen, warum die dritte Bedingung ausgelöst wird.Was sollst du tun?
Löschen Sie die erste,
course_enrollment_settings
damit es keine gibtcase_value
, sodass MySQL weiß, dass Sie die zweite Variante von verwenden möchtenCASE
:CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
Jetzt können Sie Ihre vollständigen Bedingungen als bereitstellen
search_condition
.Lesen Sie auch die Dokumentation zu den von Ihnen verwendeten Funktionen.
quelle
Ich denke, ein Teil davon ist, dass Sie den Wert angeben, nach dem Sie auswählen
CASE
, und anschließend dieWHEN x = y
Syntax verwenden, die eine Kombination aus zwei verschiedenen Verwendungsmethoden darstelltCASE
. Es sollte entweder seinoder
quelle