Oracle SQL實現階乘的幾個方法
第一個:字串疊加運演算法
原理是先將要相乘的數用字串拼接起來,然後將拼接的逗號替換為乘號,再用dbms_aw.evel_number函式對字串運算,即可得所求結果:
SQL> select rownum rn, dbms_aw.eval_number(replace(wmsys.wm_concat(rownum)over(order by rownum), ',', '*')) serial_multi
2 from dual connect by rownum <= 12
3 /
RN SERIAL_MULTI
---------- ------------
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
12 rows selected
第二種:指數運演算法。
這個方法在以前的blog中已經舉例過。原理上不再做說明了。
SQL> select rownum rn, power(10, sum(log(10, rownum))over(order by rownum)) serial_mul,
2 sum(rownum)over(order by rownum) serial_add
3 from dual connect by rownum <= 12
4 /
RN SERIAL_MUL SERIAL_ADD
---------- ---------- ----------
1 1 1
2 2 3
3 6 6
4 24 10
5 120 15
6 720 21
7 5040 28
8 40320 36
9 362880 45
10 3628800 55
11 39916800 66
12 479001600 78
12 rows selected
第三種:自定義聚集函式法
這個方法與字串相加是同一個原理。也就是呼叫oracle的聚集函式介面來實現數字的連乘。這裡不再做多說明。需要注意的是,為何Oracle提供了sum卻不提供類似連加的連乘法呢?個人估計是連乘法結果太大,Oracle不希望自己來處理這種問題了,只需要對外提供介面讓人們自己去實現好了。
原理是先將要相乘的數用字串拼接起來,然後將拼接的逗號替換為乘號,再用dbms_aw.evel_number函式對字串運算,即可得所求結果:
SQL> select rownum rn, dbms_aw.eval_number(replace(wmsys.wm_concat(rownum)over(order by rownum), ',', '*')) serial_multi
2 from dual connect by rownum <= 12
3 /
RN SERIAL_MULTI
---------- ------------
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
12 rows selected
第二種:指數運演算法。
這個方法在以前的blog中已經舉例過。原理上不再做說明了。
SQL> select rownum rn, power(10, sum(log(10, rownum))over(order by rownum)) serial_mul,
2 sum(rownum)over(order by rownum) serial_add
3 from dual connect by rownum <= 12
4 /
RN SERIAL_MUL SERIAL_ADD
---------- ---------- ----------
1 1 1
2 2 3
3 6 6
4 24 10
5 120 15
6 720 21
7 5040 28
8 40320 36
9 362880 45
10 3628800 55
11 39916800 66
12 479001600 78
12 rows selected
第三種:自定義聚集函式法
這個方法與字串相加是同一個原理。也就是呼叫oracle的聚集函式介面來實現數字的連乘。這裡不再做多說明。需要注意的是,為何Oracle提供了sum卻不提供類似連加的連乘法呢?個人估計是連乘法結果太大,Oracle不希望自己來處理這種問題了,只需要對外提供介面讓人們自己去實現好了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-664600/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 整理了SQL Server中是實現日曆的幾個方法SQLServer
- c語言實現階乘C語言
- 高階語言實現的幾個點
- c#遞迴實現 階乘C#遞迴
- Oracle中實現連乘Oracle
- Oracle實現連乘的辦法Oracle
- SQL SERVER 求階乘之和SQLServer
- Oracle中實現連乘(二)Oracle
- 分享幾個實用的方法
- 階乘很簡單?說實話,這幾道階乘相關面試題你還真不一定懂!面試題
- Oracle AWR中常用到的幾個SQL語句OracleSQL
- Oracle 檢視sql開幾個並行OracleSQL並行
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 實現秒殺的幾個想法
- Css實現垂直居中的幾種方法CSS
- java單例的幾種實現方法Java單例
- 單條SQL語句實現複雜邏輯的幾個例子(1)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(2)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(3)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(4)SQL
- 單條SQL語句實現複雜邏輯的幾個例子(5)SQL
- 實現累加的經典sql方法SQL
- sql行列轉置的實現方法SQL
- 實現多個標籤頁之間通訊的幾種方法
- FCC - 253 計算一個整數的階乘
- web前端的幾個階段Web前端
- 定義一個求n的階乘的函式函式
- C語言用遞迴方法求解階乘C語言遞迴
- 單條SQL語句實現複雜邏輯的幾個例子(4)續~SQL
- 幾個framelayout 的可以實現不重疊
- 關於singleton的幾個實現
- SQL Server中刪除重複資料的幾個方法SQLServer
- div實現水平垂直居中的幾種方法
- 實現三欄佈局的幾種方法
- css實現垂直水平居中的幾種方法CSS
- go實現QR訂閱的幾種方法Go
- PL/SQL初學者必讀:幾十個實用的PL/SQL (轉)SQL
- 9*9乘法口決pl/sql的多種方法實現(pl/sql實現)SQL