【问题标题】:SQL switch from decode to caseSQL 从解码切换到大小写
【发布时间】:2015-08-22 03:52:28
【问题描述】:

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

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

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

【问题讨论】:

  • 其实H2确实支持decode。但是使用case 是有意义的,因为所有数据库都支持它。

标签: sql oracle oracle11g case h2


【解决方案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

【讨论】:

  • 您的 ORDER BY 子句有问题。每当 DECODE 使用默认值时,将无法保证排序。您的查询将仅对值 FIRST RATE 和 SECOND RATE 具有正确的顺序,对于这两个值以外的值,将永远无法保证顺序。
【解决方案2】:

ORDER BY DECODE(APR(ACC.RATE,'X'), 'First RATE', 1, 'Second 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>

【讨论】:

  • 如果表达式 APR(ACC.RATE,'X') 没有给出唯一值怎么办?要获得保证的稳定(确定性)行顺序,只需将所选表的主键附加到“order by”表达式列表的末尾。
猜你喜欢
  • 2013-08-01
  • 2010-09-17
  • 1970-01-01
  • 2016-03-05
  • 2020-07-19
  • 2013-02-27
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多