Oracle 위 열 Level 사용

8461 단어 OracleSql
Oracle 위 열 Level 사용
1 ID 의 수량 에 따라 순서대로 전개
현재 표 데 이 터 는 다음 과 같 습 니 다.
사용자 ID
시작 날짜
종료 날짜
USER_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
핸드폰 번호
수량
USER_ID
Mobile
CNT
U101
12345
3
U102
33563
4
다음 데 이 터 를 생 성 하려 면:
사용자 ID
핸드폰 번호
번호
USER_ID
MOBILE
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('   ');

USER_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
a
1
a
2
a
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;

좋은 웹페이지 즐겨찾기