Oracle——connect by (Level/Rownum) 的一些用法

时间:2024-03-12 16:26:34

1.字符串‘A,B,C,D’ , 根据‘,’转列。

 SELECT REGEXP_SUBSTR(\'A,B,C,D\',  \'[^,]+\',   1,   ROWNUM)
   FROM DUAL 
CONNECT BY ROWNUM <= REGEXP_COUNT(\'A,B,C,D\',  \'[,]\',  1) + 1;

 2.生成10个随机数

SELECT ROWNUM RN, ROUND(DBMS_RANDOM.VALUE(0, 1000),2) RANDOM
  FROM DUAL
CONNECT BY ROWNUM <= 1000;

 扩展:DBMS_RANDOM是Oracle提供的一个PL/SQL包,用于生成随机数据和字符。它具有以下函数。

       其中,initialize,random,terminate函数在Oracle11g中已不推荐使用,主要用于向后兼容。

  • INITIALIZE : 初始化DBMS_RANDOM值,使在不同的会话中,不同的用户下,随机生成的值一样。
  • NORMAL :函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。
  • RANDOM:返回值的范围为: [-2^31, 2^31),返回的是整数。语法:DBMS_RANDOM.RANDOM(\'范围起\',\'范围止\'),不带参数返回整数。
  • STRING:随机生成字符串  语法:DBMS_RANDOM.STRING(\'字符串格式\',\'字符串长度\')

3.列出两个月份之间所有的月份/两个星期之间所有的天

SELECT TO_CHAR(ADD_MONTHS(DATE \'2009-03-01\', ROWNUM - 1), \'YYYY-MM\') MONTHS
  FROM DUAL
CONNECT BY ROWNUM <= MONTHS_BETWEEN(DATE \'2010-03-01\', DATE \'2009-03-01\') + 1;

SELECT TO_CHAR(DATE\'2009-05-11\' + ROWNUM - 1, \'YYYY-MM-DD\') AS DAYS
FROM DUAL
CONNECT BY ROWNUM <= DATE\'2009-05-23\' - DATE\'2009-05-11\' + 1