SQL从解码切换到大小写

时间:2015-06-07 17:15:30

标签: sql oracle oracle11g case h2

我有一个类似这样的查询......

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

因为我正在处理h2数据库而h2没有解码和解码别名很难实现所以我想知道我是否可以将此DECODE转换为CASE语句。我如何转换它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

通过解码订购(APR(ACC.RATE,'X'),'第一速率',1,'第二速率',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>