欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle生成連續(xù)的數(shù)字/字符/時間序列的常用語法

 更新時間:2024年04月15日 10:40:31   作者:不剪發(fā)的Tony老師  
這篇文章主要介紹了Oracle生成連續(xù)的數(shù)字/字符/時間序列的常用語法,在 Oracle 中實現(xiàn)數(shù)據(jù)行生成的方法有很多,本文只介紹幾種常用的語法,文中有相關的代碼示例供大家參考,需要的朋友可以參考下

在 Oracle 中實現(xiàn)數(shù)據(jù)行生成的方法有很多,本文只介紹幾種常用的語法。

使用層次查詢生成序列

Oracle 提供了 CONNECT BY 層次查詢,可以用于生成數(shù)字序列。

生成一個連接的數(shù)字序列

以下語句使用 CONNECT BY 和 LEVEL 偽列生成了一個連續(xù)的數(shù)字序列:

SELECT LEVEL AS n
FROM dual
WHERE LEVEL >= 11
CONNECT BY LEVEL <= 15;
N |
--|
11|
12|
13|
14|
15|

通過修改查詢條件中的 LEVEL 范圍,可以返回不同的數(shù)字序列。

除了使用 LEVEL 偽列之外,也可以使用 ROWNUM 偽列實現(xiàn)相同的功能:

SELECT rownum AS n
FROM dual
CONNECT BY LEVEL <= 5;
N|
-|
1|
2|
3|
4|
5|

生成一個間隔的數(shù)字序列

以下查詢利用 mod 函數(shù)返回了一個從 2 到 15 之間、增量為 3 的數(shù)字序列:

SELECT LEVEL AS n
FROM dual
WHERE LEVEL >= 2 AND MOD(LEVEL-2, 3)=0
CONNECT BY LEVEL <= 15;
N |
--|
 2|
 5|
 8|
11|
14|

以下查詢返回了一個增量為 -2.5、范圍從 15 到 1.4 之間的降序數(shù)字序列:

SELECT (LEVEL-1) * -2.5 + 15 AS n
FROM dual
WHERE LEVEL >= 1
CONNECT BY (LEVEL-1) * -2.5 + 15 >= 1.4;
N   |
----|
  15|
12.5|
  10|
 7.5|
   5|
 2.5|

生成一個連續(xù)的字符序列

基于上面的層次查詢和 chr(n) 函數(shù)可以生成連續(xù)的字符序列。例如:

SELECT CHR(LEVEL-1+65) AS letter
FROM dual 
CONNECT BY LEVEL-1 <= 70-65;
LETTER|
------|
A     |
B     |
C     |
D     |
E     |
F     |

該查詢返回了字符 A 到 F 的序列,chr(n) 函數(shù)用于將 ASCII 編碼轉(zhuǎn)化為相應的字符。

生成一個間隔的時間序列

同樣基于以上層次查詢和時間加減法可以生成間隔的時間序列。例如:

SELECT TIMESTAMP '2020-01-01 00:00:00' + (LEVEL-1)/24 AS ts
FROM dual 
CONNECT BY LEVEL <= 12;
TS                 |
-------------------|
2020-01-01 00:00:00|
2020-01-01 01:00:00|
2020-01-01 02:00:00|
2020-01-01 03:00:00|
2020-01-01 04:00:00|
2020-01-01 05:00:00|
2020-01-01 06:00:00|
2020-01-01 07:00:00|
2020-01-01 08:00:00|
2020-01-01 09:00:00|
2020-01-01 10:00:00|
2020-01-01 11:00:00|

該查詢返回了 2020-01-01 00:00:00 到 2020-01-01 12:00:00、間隔為 1 小時的所有時間點。

使用表函數(shù)生成序列

Oracle 支持表函數(shù)(table function),也就是返回結(jié)果為集合(表)的函數(shù),可以用于模擬 PostgreSQL 中的 generate_series 函數(shù)。

創(chuàng)建模擬的 generate_series 函數(shù)

我們創(chuàng)建一個 PL/SQL 函數(shù) generate_series:

CREATE OR REPLACE FUNCTION generate_series (pstart IN NUMBER, pstop IN NUMBER, pstep IN NUMBER DEFAULT 1)
RETURN sys.odcinumberlist DETERMINISTIC PIPELINED
AS
BEGIN
  IF (pstep = 0) THEN
    raise_application_error(-20001, 'step size cannot equal zero!');
  END IF;
  
  IF (pstart > pstop AND pstep > 0) OR (pstart < pstop AND pstep < 0) THEN
    RETURN;
  END IF;
  
  FOR i IN 0 .. floor(abs((pstop-pstart)/pstep)) LOOP
    PIPE ROW (pstart + i * pstep);
  END LOOP;
    
  RETURN;
END generate_series;

其中,sys.odcinumberlist 是 Oracle 預定義的變長數(shù)組類型;PIPELINED 表示定義管道表函數(shù);pstart 表示數(shù)據(jù)序列的起點,pstop 表示數(shù)據(jù)序列的終點,pstep 表示每次的增量,不允許為 0,默認為 1。

使用 generate_series 函數(shù)生成序列

創(chuàng)建了 generate_series 函數(shù)之后,我們就可以用它來生成各種序列值。例如:

SELECT * FROM TABLE(generate_series(11, 15));
COLUMN_VALUE|
------------|
          11|
          12|
          13|
          14|
          15|

SELECT * FROM TABLE(generate_series(15, 1.4, -2.5));
COLUMN_VALUE|
------------|
          15|
        12.5|
          10|
         7.5|
           5|
         2.5|

其中,TABLE 函數(shù)用于將數(shù)組轉(zhuǎn)換為表;第一個函數(shù)返回了 11 到 15 的連續(xù)整數(shù);第二個函數(shù)返回了 15 到 1.4 之間增量為 -2.5 的降序序列。

我們同樣可以使用 generate_series 函數(shù)生成字符序列和時間序列:

SELECT chr(column_value) FROM TABLE(generate_series(65, 70));
CHR(COLUMN_VALUE)|
-----------------|
A                |
B                |
C                |
D                |
E                |
F                |

SELECT TIMESTAMP '2020-01-01 00:00:00' + (column_value-1)/24 AS ts
FROM TABLE(generate_series(1, 12));
TS                 |
-------------------|
2020-01-01 00:00:00|
2020-01-01 01:00:00|
2020-01-01 02:00:00|
2020-01-01 03:00:00|
2020-01-01 04:00:00|
2020-01-01 05:00:00|
2020-01-01 06:00:00|
2020-01-01 07:00:00|
2020-01-01 08:00:00|
2020-01-01 09:00:00|
2020-01-01 10:00:00|
2020-01-01 11:00:00|

使用通用表表達式生成序列

生成一個等差數(shù)字序列

通用表表達式(Common Table Expression)的遞歸調(diào)用可以用于生成各種數(shù)列。例如:

WITH t(n) AS (
  SELECT 1 FROM dual
  UNION ALL
  SELECT n+2 FROM t WHERE n < 9
)
SELECT n FROM t;
N|
-|
1|
3|
5|
7|
9|

以上語句生成了一個從 1 遞增到 9、增量為 2 的數(shù)列,執(zhí)行過程如下:

  • 首先,執(zhí)行 CTE 中的初始化查詢,生成一行數(shù)據(jù)(1);
  • 然后,第一次執(zhí)行遞歸查詢,判斷 n < 9,生成一行數(shù)據(jù) 3(n+2);
  • 接著,重復執(zhí)行遞歸查詢,生成更多的數(shù)據(jù);直到 n = 9 時不滿足條件終止遞歸;此時臨時表 t 中包含 5 條數(shù)據(jù);
  • 最后,執(zhí)行主查詢,返回所有的數(shù)據(jù)。

生成一個等比數(shù)字序列

上文模擬的 generate_series 函數(shù)只能生成等差數(shù)列,通用表表達式則可以生成更復雜的數(shù)列,例如等比數(shù)列:

WITH t(n) AS (
  SELECT 1 FROM dual
  UNION ALL
  SELECT n*3 FROM t WHERE n < 100
)
SELECT n FROM t;
N  |
---|
  1|
  3|
  9|
 27|
 81|
243|

從第二行開始,每個數(shù)字都是上一行的 3 倍。

生成斐波那契數(shù)列

斐波那契數(shù)列(Fibonacci series)是指從數(shù)字 0 和 1(或者從 1 和 1)開始,后面的每個數(shù)字等于它前面兩個數(shù)字之和(0、1、1、2、3、5、8、13、21、…)。使用通用表表達式可以很容易地生成斐波那契數(shù)列:

WITH fibonacci (n, fib_n, next_fib_n) AS (
  SELECT 1, 0, 1 FROM dual
  UNION ALL
  SELECT n + 1, next_fib_n, fib_n + next_fib_n
  FROM fibonacci
  WHERE n < 10 )
SELECT * FROM fibonacci;
N |FIB_N|NEXT_FIB_N|
--|-----|----------|
 1|    0|         1|
 2|    1|         1|
 3|    1|         2|
 4|    2|         3|
 5|    3|         5|
 6|    5|         8|
 7|    8|        13|
 8|   13|        21|
 9|   21|        34|
10|   34|        55|

其中,字段 n 表示該行包含了第 n 個斐波那契數(shù)列值;字段 fib_n 表示斐波那契數(shù)列值;字段 next_fib_n 表示下一個斐波那契數(shù)列值。

生成一個連續(xù)的字符序列

基于通用表表達式和 CHR(n) 函數(shù)同樣可以生成連續(xù)的字符序列,例如:

WITH t(n) AS (
  SELECT 65 FROM dual
  UNION ALL
  SELECT n+1 FROM t WHERE n <= 70
)
SELECT chr(n) FROM t;
CHR(N)|
------|
A     |
B     |
C     |
D     |
E     |
F     |
G     |

生成一個間隔的時間序列

以下語句使用遞歸通用表表達式生成一個時間序列:

WITH ts(v) AS (
  SELECT TIMESTAMP '2020-01-01 00:00:00' FROM dual
  UNION ALL
  SELECT v + 1/24 FROM ts WHERE v < TIMESTAMP '2020-01-01 12:00:00'
)
SELECT v FROM ts;
V                  |
-------------------|
2020-01-01 00:00:00|
2020-01-01 01:00:00|
2020-01-01 02:00:00|
2020-01-01 03:00:00|
2020-01-01 04:00:00|
2020-01-01 05:00:00|
2020-01-01 06:00:00|
2020-01-01 07:00:00|
2020-01-01 08:00:00|
2020-01-01 09:00:00|
2020-01-01 10:00:00|
2020-01-01 11:00:00|
2020-01-01 12:00:00|

以上查詢返回了一個表,數(shù)據(jù)為 2020-01-01 00:00:00 到 2020-01-01 12:00:00,間隔為 1 小時的時間點。

到此這篇關于Oracle生成連續(xù)的數(shù)字/字符/時間序列的常用語法的文章就介紹到這了,更多相關Oracle連續(xù)數(shù)字/字符/時間序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Oracle(90)數(shù)據(jù)庫如何創(chuàng)建用戶(User)

    Oracle(90)數(shù)據(jù)庫如何創(chuàng)建用戶(User)

    這篇文章主要介紹了在Oracle數(shù)據(jù)庫中創(chuàng)建用戶的過程,包括連接到數(shù)據(jù)庫、創(chuàng)建用戶、分配權限、分配表空間和設置賬戶狀態(tài),提供了詳細的步驟和代碼示例,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • 登錄oracle數(shù)據(jù)庫時密碼忘記的解決方法

    登錄oracle數(shù)據(jù)庫時密碼忘記的解決方法

    登錄本地oracle數(shù)據(jù)庫時,忘記密碼了,這種情況時有發(fā)生,下面有個不錯的解決方法,希望對大家有所幫助
    2014-01-01
  • PL/SQL登錄Oracle數(shù)據(jù)庫報錯ORA-12154:TNS:無法解析指定的連接標識符已解決(本地未安裝Oracle需要連接服務器上的)

    PL/SQL登錄Oracle數(shù)據(jù)庫報錯ORA-12154:TNS:無法解析指定的連接標識符已解決(本地未安裝Oracle

    這篇文章主要介紹了PL/SQL登錄Oracle數(shù)據(jù)庫報錯ORA-12154:TNS:無法解析指定的連接標識符已解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Oracle表空間與權限的深入講解

    Oracle表空間與權限的深入講解

    Oracle表空間(tablespaces)是一個邏輯的概念,真正存放數(shù)據(jù)的是數(shù)據(jù)文件(data files),下面這篇文章主要給大家介紹了關于Oracle表空間與權限的相關資料,需要的朋友可以參考下
    2021-11-11
  • oracle 監(jiān)聽 lsnrctl 命令 (推薦)

    oracle 監(jiān)聽 lsnrctl 命令 (推薦)

    這篇文章主要介紹了oracle 監(jiān)聽 lsnrctl 命令 ,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • ORACLE隱藏參數(shù)查看及修改的方法

    ORACLE隱藏參數(shù)查看及修改的方法

    這篇文章主要介紹了ORACLE隱藏參數(shù)查看及修改的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Oracle數(shù)據(jù)完整性和鎖機制簡析

    Oracle數(shù)據(jù)完整性和鎖機制簡析

    事務不是程序,事務和程序分屬兩個概念,事務控制語句稱為TCL,一般包括Commit和Rollback,需要了解的朋友可以參考下
    2012-11-11
  • oracle中左填充(lpad)和右填充(rpad)的介紹與用法

    oracle中左填充(lpad)和右填充(rpad)的介紹與用法

    這篇文章主要跟大家介紹了關于oracle中左填充(lpad)和右填充(rpad)的相關資料,通過填充我們可以固定字段的長度,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • Oracle歸檔日志寫滿(ora-00257)了怎么辦

    Oracle歸檔日志寫滿(ora-00257)了怎么辦

    今天在使用oracle數(shù)據(jù)庫做項目時,突然報錯:ORA-00257: archiver error. Connect internal only, until freed,該問題如何解決呢?經(jīng)過本人一番折騰此問題還要歸檔于日志滿了,下面小編把Oracle歸檔日志寫滿(ora-00257)的解決辦法在此分享給大家供大家參考
    2015-10-10
  • Oracle Index Partition索引分區(qū)的注意事項

    Oracle Index Partition索引分區(qū)的注意事項

    Oracle索引分區(qū)的管理是一個復雜而重要的過程,需要數(shù)據(jù)庫管理員具備豐富的經(jīng)驗和專業(yè)知識,通過合理的索引分區(qū)策略、定期的維護和優(yōu)化以及注意事項的遵循,可以確保數(shù)據(jù)庫的性能和穩(wěn)定性,這篇文章主要介紹了Oracle Index Partition索引分區(qū)的管理,需要的朋友可以參考下
    2024-08-08

最新評論