簡體   English   中英

當混合[compare_value]和[condition]在WHEN塊中的條件不起作用時,MySQL CASE

[英]MySQL CASE WHEN mixing [compare_value] and [condition] doesn't work conditions in WHEN blocks

有人可以解釋為什么這不能按預期進行。 以及如何在MySQL數據庫上正確實現此邏輯? 下面的例子:

create table test( effort text );
      insert into test values('0.1');
      insert into test values('0.25');
      insert into test values('1.5');
      insert into test values('5');
      insert into test values('10');

SQL

select effort, CASE effort 
    WHEN 0.1 THEN 5
    WHEN 0.25 THEN 4
    WHEN (CAST(effort AS DECIMAL(5,2)) < 3) THEN 3
    WHEN (CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
    WHEN (CAST(effort AS DECIMAL(5,2)) > 8) THEN 1
    END as 'ISE' from test

結果:

在此處輸入圖片說明

您不能混合使用兩種類型的case語句-簡單語句和搜索語句。 因此,為每個條件設置條件:

select effort,
       (CASE WHEN effort = '0.1' THEN 5
             WHEN effort = '0.25' THEN 4
             WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
             WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
             WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END) as ISE
from test;

您會注意到,我為字符串比較切換了相等類型。 您將effort存儲為字符串,因此比較應為字符串或使用顯式比較。

相反,我建議您將值存儲為DECIMAL(5, 2)而不是字符串。 然后,該case將寫為:

select effort,
       (CASE WHEN effort = 0.1 THEN 5
             WHEN effort = 0.25 THEN 4
             WHEN effort < 3 THEN 3
             WHEN effort between 3.0 AND 8.0) THEN 2
             WHEN effort > 8 THEN 1
        END) as ISE
from test;

我認為沒有必要將值存儲為字符串(如果打算將其用作數字)。

select effort,
       CASE WHEN effort = '0.1' THEN 5
            WHEN effort = '0.25' THEN 4
            WHEN CAST(effort AS DECIMAL(5,2)) < 3 THEN 3
            WHEN CAST(effort AS DECIMAL(5,2)) between 3.0 AND 8.0) THEN 2
            WHEN CAST(effort AS DECIMAL(5,2)) > 8 THEN 1
        END as ISE
from test;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM