MySQL中使用CASE出错,如何在MySQL中正确使用CASE..WHEN
如何在MySQL中正確使用CASE..WHEN
這里是一個演示查詢,注意它非常簡單,僅在base_price為0的位置獲取,并且仍然select條件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是decimal(8,0)
當在我的數據庫上運行這個時,我得到:
3 0
3 0
3 0
3 0
3 0
在CASE之后立即刪除course_enrollment_settings.base_price :
SELECT CASE WHEN course_enrollment_settings.base_price = 0 THEN 1 ... END
CASE有兩種不同的forms,詳見手冊 。 在這里,你需要第二種forms,因為你正在使用search條件 。
CASE case_value WHEN when_value THEN statements [WHEN when_value THEN statements] ELSE statements END
要么:
CASE WHEN THEN statements [WHEN THEN statements] ELSE statements END
這里CASE是第二種情況下的expression式search_condition將進行評估,如果沒有search_condition是相等的,則執行else
SELECT CASE course_enrollment_settings.base_price WHEN course_enrollment_settings.base_price = 0 THEN 1
應該
SELECT CASE WHEN course_enrollment_settings.base_price = 0 THEN 1
CASE course_enrollment_settings.base_price在這里是錯誤的,它應該只是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
一些解釋。 您的原始查詢將被執行為:
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, ...
這就是為什么你總是得到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
CASE有兩種變體 ,你不使用你認為的那種變體 。
你在做什么
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE
每個條件松散地等同于if (case_value == when_value) (偽代碼)。
然而,你已經把整個條件作為when_value ,導致類似于:
if (case_value == (case_value > 100))
現在, (case_value > 100)計算結果為FALSE ,并且是您這樣做的唯一條件。 所以,現在你有:
if (case_value == FALSE)
FALSE轉換為0并通過生成的完整expression式if (case_value == 0)您現在可以看到為什么第三個條件觸發。
你應該做什么
放下第一個course_enrollment_settings以便沒有case_value ,導致MySQL知道你打算使用CASE的第二個變體:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
現在你可以提供你的完整條件為search_condition 。
另外,請閱讀文檔以了解您使用的function。
我認為其中的一部分就是說明您在CASE之后select的值,然后使用WHEN x = y語法,這是兩種使用CASE不同方法的組合。 它應該是
CASE X WHEN a THEN ... WHEN b THEN ...
要么
CASE WHEN x = a THEN ... WHEN x = b THEN ...
總結
以上是生活随笔為你收集整理的MySQL中使用CASE出错,如何在MySQL中正确使用CASE..WHEN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钟薛高为何室温下放置1小时不化引网友担心
- 下一篇: 小米笔记本Pro 2022搭载酷睿P系列