从解码SQL开关来区分(SQL switch from decode to case)

2019-10-23 07:49发布

我有一个查询,做这样的事情...

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

因为我处理的H2数据库和h2可是没有解码和解码别名是非常难以实现的,所以我在想,如果我可以这样DECODE转换成CASE语句。 如何转换呢?

Answer 1:

解码方式:

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


Answer 2:

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

没有您的ORDER BY子句中的一个问题。 每当解码使用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>


文章来源: SQL switch from decode to case