2017-08-09 15 views
0

我想要做的是這樣的:在很多條件下使用SQL的CASE?

case_1 case_2 case_3 Final 
0   0 0  0 
0   0 1  3 
0   1 0  2 
1   0 0  1 
1   1 0  2 
1   0 1  3 
0   1 1  3 
1   1 1  3 

這時候case_1爲0表示,case_2是0和case_3是0,最終山坳具有值爲0 同樣,當case_1是1,case_2爲1並且case_3是1,最後的列將是3. 等等。

什麼我結束了打字SQL這是尷尬的:

Select *, 
case when case_1>0 and case_2>0 and case_3>0 then 3 else 0, 
case when case_1>0 and case_2>0 and case_3=0 then 2 else 0, 
case when case_1>0 and case_2=0 and case_3=0 then 1 else 0, 
.... 
.... 
.... 
from mytable; 

現在,這是嚴重不利的,我知道。有沒有更好的編碼方式?

+0

這些列可以包含除「0」和「1」以外的任何內容嗎? – Barmar

+0

@Barmar只有0,1,2和3爲最後一列,其餘三個有0或1 –

+0

我真的不明白。爲什麼你想要的輸出只有一個'Final'列,但你的查詢有多個'case'表達式?哪一個纔是真正的'Final'? – Barmar

回答

2

從例子,它看起來像的優先級爲3的情況下 - >情況下,2 - >殼1在這種情況下,你可以這樣做:

SELECT *, 
CASE WHEN case_3 > 0 THEN 3 
    WHEN case_2 > 0 THEN 2 
    WHEN case_1 > 0 THEN 1 
ELSE 0 END AS `Final` 
FROM table; 
+3

修復你的'CASE'語法。在每個WHEN條款之前不要重複'CASE'。 – Barmar

+0

@Barmar歡呼起來。這是一個複製粘貼錯誤:( –

1

看起來要非零列的最右邊的位置,如果有的話

select *, 
    case when case_3>0 then 3 else 
     case when case_2>0 then 2 else 
     case when case_1>0 then 1 else 0 end 
     end 
    end final 
from tbl 
+2

你不需要嵌套多個'case'表達式,你可以在單個表達式中使用多個WHEN子句。 – Barmar

+0

@Barmar right,'when when when end' will do。讓我留下我的答案,只是爲了顯示完整版本。 – Serg

1

對於什麼是值得的,電氣工程知道這個問題是「從真值表生成布爾表達式」。

我和其他回答者的方向不同。

八行4列自己創建一個微小的查找表,這樣

SELECT * FROM final 

| case_1 | case_2 | case_3 | Final | 
|--------|--------|--------|-------| 
|  0 |  0 |  0 |  0 | 
|  0 |  0 |  1 |  3 | 
|  0 |  1 |  0 |  2 | 
|  1 |  0 |  0 |  1 | 
|  1 |  1 |  0 |  2 | 
|  1 |  0 |  1 |  3 | 
|  0 |  1 |  1 |  3 | 
|  1 |  1 |  1 |  3 | 

然後加入到它的主數據表做你的final值的查詢,像這樣的(http://sqlfiddle.com/#!9/4de009/1/0)。

SELECT a.Name, b.Final 
    FROM test a 
    JOIN final b ON a.case_1 = b.case_1 
       AND a.case_2 = b.case_2 
       AND a.case_3 = b.case_3 

表現?在八行查找表中不是問題。 SQL是爲此做出的。

靈活性?如果您的計算規則Final更改,您只需更新表格即可。您不必再次執行布爾表達式簡化。

複雜性?那麼,是的,它比嵌套的CASE或IF語句更爲複雜。但它更容易閱讀。