2009年1月12日 星期一

Meaningful numeric expression using DB2 9


/*
  在 db2 forum 看到一個問題:
  提問的人想要將 2.00000000000000E+010 轉成 readable、
  meaningful 2x10^10。
  And here is my recursive sql
  ※用 DB2 9 的 New Datatype Decfloat,
   在 decimal 型態轉 char 很方便
*/

/* using Recursive SQL,一直除10,除到 >= 1 */

WITH N(ORGVAL,RESULTVAL,DIVVAL,PLUS)
AS
(SELECT ORGVAL,ORGVAL / DIVVAL RESULTVAL,DIVVAL,1 PLUS
 FROM (SELECT DECFLOAT(2.00000000000000E+010) ORGVAL,
         10 DIVVAL
     FROM  SYSIBM.SYSDUMMY1) T
 UNION ALL
 SELECT N.ORGVAL,N.RESULTVAL / 10,DIVVAL,N.PLUS + 1
 FROM  N
 WHERE N.RESULTVAL / 10 >= 1
)
SELECT RTRIM(CHAR(RESULTVAL))||'x'||
     RTRIM(CHAR(DIVVAL))||'^'||
     RTRIM(CHAR(PLUS))
FROM  (SELECT RESULTVAL,DIVVAL,PLUS,
         ROW_NUMBER() OVER(ORDER BY PLUS DESC) OID
     FROM N) T1
WHERE OID = 1;

/* 2.00000000000000E+010的結果 */
2x10^10

/* 測試 0.125040000000000E+010 */

WITH N(ORGVAL,RESULTVAL,DIVVAL,PLUS)
AS
(SELECT ORGVAL,ORGVAL / DIVVAL RESULTVAL,DIVVAL,1 PLUS
 FROM (SELECT DECFLOAT(0.125040000000000E+010) ORGVAL,
         10 DIVVAL
     FROM SYSIBM.SYSDUMMY1) T
 UNION ALL
 SELECT N.ORGVAL,N.RESULTVAL / 10,DIVVAL,N.PLUS + 1
 FROM  N
 WHERE N.RESULTVAL / 10 >= 1
)
SELECT RTRIM(CHAR(RESULTVAL))||'x'||
     RTRIM(CHAR(DIVVAL))||'^'||
     RTRIM(CHAR(PLUS))
FROM  (SELECT RESULTVAL,DIVVAL,PLUS,
         ROW_NUMBER() OVER(ORDER BY PLUS DESC) OID
     FROM N) T1
WHERE  OID = 1;

/* 0.125040000000000E+010的結果 */
1.2504x10^9

/* 測試 1.39080000000000E+010 */

WITH N(ORGVAL,RESULTVAL,DIVVAL,PLUS)
AS
(SELECT ORGVAL,ORGVAL / DIVVAL RESULTVAL,DIVVAL,1 PLUS
 FROM (SELECT DECFLOAT(1.39080000000000E+010) ORGVAL,
         10 DIVVAL
     FROM SYSIBM.SYSDUMMY1) T
 UNION ALL
 SELECT N.ORGVAL,N.RESULTVAL / 10,DIVVAL,N.PLUS + 1
 FROM  N
 WHERE N.RESULTVAL / 10 >= 1
)
SELECT RTRIM(CHAR(RESULTVAL))||'x'||
     RTRIM(CHAR(DIVVAL))||'^'||
     RTRIM(CHAR(PLUS))
FROM  (SELECT RESULTVAL,DIVVAL,PLUS,
         ROW_NUMBER() OVER(ORDER BY PLUS DESC) OID
     FROM N) T1
WHERE  OID = 1;

/* 1.39080000000000E+010的結果 */
1.3908x10^10