我有一個查詢,做這樣的事情...SQL開關來區分
SELECT * FROM ...
...
ORDER BY DECODE(APR(ACC.RATE,'X'), 'FIRST RATE', 1, 'SECOND RATE', 2, 3);
因爲我處理的H2數據庫和h2可是沒有解碼和解碼別名是非常難以實現的,所以我想知道我是否可以將此DECODE轉換爲CASE語句。我如何轉換它?
我有一個查詢,做這樣的事情...SQL開關來區分
SELECT * FROM ...
...
ORDER BY DECODE(APR(ACC.RATE,'X'), 'FIRST RATE', 1, 'SECOND RATE', 2, 3);
因爲我處理的H2數據庫和h2可是沒有解碼和解碼別名是非常難以實現的,所以我想知道我是否可以將此DECODE轉換爲CASE語句。我如何轉換它?
解碼裝置:
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
非常感謝你 – logger
你的ORDER BY子句有問題。只要DECODE使用默認值,那麼排序就不會得到保證。您的查詢將僅針對FIRST RATE和SECOND RATE的值進行正確排序,對於除這兩個值以外的值,訂單將永遠不會得到保證。 –
ORDER BY DECODE(APR(ACC.RATE, 'X'), '第一速率',1, '第二RATE' ,2,3);
您的ORDER BY條款存在問題。每當DECODE使用default value
,那麼排序將不保證。您的查詢將具有正確的訂購只有爲值FIRST RATE
和SECOND 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>
實際上,H2不支持'decode'。但是使用'case'是有意義的,因爲這是所有數據庫都支持的。 –