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 文字列を転置してインターセプトする
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;