Oracle 疑似列レベルの使用

Oracle 疑似列レベルの使用

1 ID数に応じて順番に展開

既存のテーブルデータは次のとおりです。

ユーザーID 開始日 終了日
ユーザーID START_DT END_DT
U101 2016-11-02 2016-11-06
U102 2015-06-01 2015-06-03

次のデータを生成するには:

ユーザーID 日にち
U101 2016-11-02
U101 2016-11-03
U101 2016-11-04
U101 2016-11-05
U101 2016-11-06
U102 2015-06-01
U102 2015-06-02
U102 2015-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 電話番号
ユーザーID モバイル CNT
U101 12345 3
U102 33563 4

次のデータを生成するには:

ユーザーID 電話番号 シリアルナンバー
ユーザーID モバイル LV
U101 12345 1
U101 12345 2
U101 12345 3
U102 33563 1
U102 33563 2
U102 33563 3
U102 33563 4
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('大家好');

ユーザーID STR
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;

RN STR
ある 1
ある 2
ある 3
b 4
b 5
b 6
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;

おすすめ

転載: blog.csdn.net/u012132482/article/details/53501789