Oracle伪列Level的使用

Oracle伪列Level的使用

1 根据ID的数量按序展开

现有表数据如下:

用户ID开始日期结束日期
USER_IDSTART_DTEND_DT
U1012016-11-022016-11-06
U1022015-06-012015-06-03

要生成下面的数据:

用户ID日期
U1012016-11-02
U1012016-11-03
U1012016-11-04
U1012016-11-05
U1012016-11-06
U1022015-06-01
U1022015-06-02
U1022015-06-03
    WITH TB AS
     (SELECT 'U101' USER_ID, DATE'2016-11-02' START_DT, DATE'2016-11-06' END_DT  FROM DUAL
      UNION ALL
      SELECT 'U102' , DATE'2015-06-01', DATE'2015-06-03' FROM DUAL
      )
    SELECT TB.USER_ID, TB.START_DT + LEVEL - 1
    FROM TB
    CONNECT BY TB.USER_ID = PRIOR TB.USER_ID
           AND LEVEL <= (TB.END_DT - TB.START_DT + 1)
           AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

2 根据ID的数量按序展开

现有表数据如下:

用户ID手机号数量
USER_IDMobileCNT
U101123453
U102335634

要生成下面的数据:

用户ID手机号序号
USER_IDMOBILELV
U101123451
U101123452
U101123453
U102335631
U102335632
U102335633
U102335634
WITH TB AS
 (SELECT 'U101' USER_ID, '12345' MOBILE, 3 CNT  FROM DUAL
    UNION ALL
    SELECT 'U102' , '33563', 4 FROM DUAL
 )
SELECT A.USER_ID,A.MOBILE,B.LV
    FROM TB A
    LEFT JOIN (
                    SELECT TB.USER_ID, LEVEL LV
                    FROM TB
                    CONNECT BY TB.USER_ID = PRIOR TB.USER_ID
                                 AND LEVEL <= CNT
                                 AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
                        ) B
        ON A.USER_ID = B.USER_ID

3 生成随机数据

SELECT DBMS_RANDOM.VALUE
  FROM DUAL 
  CONNECT BY LEVEL <= 100;

SELECT SYSDATE - LEVEL
  FROM DUAL 
  CONNECT BY LEVEL <= 100;

4 转置截取字符串

STR
    SELECT SUBSTR('大家好',LEVEL,1)
      FROM DUAL
    CONNECT BY LEVEL<=LENGTH('大家好');

USER_IDSTR
U1
U1
U1,
U1
U1
U2
U2
U2
U2,
U2
U2
    WITH TB AS (
      SELECT 'U1' USER_ID, '哈喽,世界' STR FROM DUAL
        UNION ALL
        SELECT 'U2', '你好啊,地球' FROM DUAL
    )
    SELECT TB.USER_ID, 
           SUBSTR(STR,LEVEL,1)
      FROM TB
    CONNECT BY TB.USER_ID = PRIOR TB.USER_ID
             AND LEVEL <= LENGTH(STR)
             AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

RNSTR
a1
a2
a3
b4
b5
b6
WITH tb AS
 (SELECT 'a' rn,         '1,2,3' i_name    FROM dual
  UNION ALL
  SELECT 'b',         '4,5,6'    FROM dual)
  SELECT rn,
       regexp_substr(i_name, '[^,]+', 1, LEVEL)
  FROM tb
CONNECT BY PRIOR dbms_random.value IS NOT NULL
       AND PRIOR rn = rn
       AND LEVEL <= length(i_name) - length(REPLACE(i_name, ',', '')) + 1;
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值