2015-06-07 22 views
1

我有一個查詢,做這樣的事情...SQL開關來區分

SELECT * FROM ... 
... 
ORDER BY DECODE(APR(ACC.RATE,'X'), 'FIRST RATE', 1, 'SECOND RATE', 2, 3); 

因爲我處理的H2數據庫和h2可是沒有解碼和解碼別名是非常難以實現的,所以我想知道我是否可以將此DECODE轉換爲CASE語句。我如何轉換它?

+0

實際上,H2不支持'decode'。但是使用'case'是有意義的,因爲這是所有數據庫都支持的。 –

回答

0

解碼裝置:

CASE FirstParam 
    WHEN SecondParam THEN ThirdParam 
    WHEN FourthParam THEN FifthParam 
    WHEN SixthParam THEN Seventh... etcetera 
    ELSE LastParam -- If number of params is odd, otherwise ELSE NULL is implied 
END 

所以

CASE APR(ACC.RATE,'X') 
    WHEN 'FIRST RATE' THEN 1 
    WHEN 'SECOND RATE' THEN 2 
    ELSE 3 
END 
+0

非常感謝你 – logger

+0

你的ORDER BY子句有問題。只要DECODE使用默認值,那麼排序就不會得到保證。您的查詢將僅針對FIRST RATE和SECOND RATE的值進行正確排序,對於除這兩個值以外的值,訂單將永遠不會得到保證。 –

0

ORDER BY DECODE(APR(ACC.RATE, 'X'), '第一速率',1, '第二RATE' ,2,3);

您的ORDER BY條款存在問題。每當DECODE使用default value,那麼排序將不保證。您的查詢將具有正確的訂購只有爲值FIRST RATESECOND RATE,對於這兩個值以外的值將永遠不會得到保證。

它是這樣的:

FIRST RATE - 1 
SECOND RATE - 2 
Anything else - 3 

因此,所有這些現在指定要排序爲value 3值,將在隨機

更好的方法是:

ORDER BY DECODE(APR(ACC.RATE,'X'), 'FIRST RATE', 1, 'SECOND RATE', 2, 3), APR(ACC.RATE,'X') 

現在,所有行保證是總是在特定順序

寫入相同的使用CASE表達

ORDER BY 
CASE (APR(ACC.RATE,'X') 
WHEN 'FIRST RATE' THEN 
    1 
WHEN 'SECOND RATE' THEN 
    2 
ELSE 
    3 
END, APR(ACC.RATE,'X') 

一個工作例如

SQL> WITH DATA(id) AS(
    2 SELECT 'X' FROM dual UNION ALL 
    3 SELECT 'A' FROM dual UNION ALL 
    4 SELECT 'Z' FROM dual UNION ALL 
    5 SELECT 'M' FROM dual UNION ALL 
    6 SELECT 'I' FROM dual UNION ALL 
    7 SELECT 'N' FROM dual 
    8 ) 
    9 SELECT * FROM DATA 
10 ORDER BY 
11 CASE id 
12 WHEN 'M' THEN 
13 1 
14 WHEN 'I' THEN 
15 2 
16 WHEN 'N' THEN 
17 3 
18 ELSE 
19 4 
20 END, id 
21/

I 
- 
M 
I 
N 
A 
X 
Z 

6 rows selected. 

SQL>