[ORACLE] CONNECT BY LEVEL

Yeojin·2023년 12월 8일
0

지난 프로젝트의 쿼리문에서 자주 등장하며 나를 애먹였던 CONNECT BY LEVEL 구문이 있었다.
다른 개발자분이 작성해놓으신 쿼리문에 포함되어 있었는데,
처음봤을때 너무 어렵게 느껴져서 해석하는데만 해도 시간이 꽤 걸렸던 기억이난다😂
그당시에는 구글링으로 어렵사리 이해하며 겨우 고비를 넘겼지만, 지금은 철수하고 시간이 있으니 제대로 이해하고 잊어버리지 않기 위해 정리를 해보려고 한다.

LEVEL을 사용하면 FOR문처럼 활용이 가능하다고 한다.

1. LEVEL로 1부터 10까지

SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 10;


2. LEVEL로 특정 날짜 범위 출력

-- +ROWNUM 만 하면 12월2일 ~ 1월1일이 출력되므로, +(ROWNUM -1)을 하면 정상출력 된다.
-- +1을 하지 않으면 1일 ~ 30일까지만 출력이 되므로, +1을 하면 31일까지 출력된다.

 SELECT TO_DATE('20231201','YYYYMMDD') + (ROWNUM -1) AS TEMP_CAL
   FROM DUAL
CONNECT BY LEVEL <= (TO_DATE('20231231','YYYYMMDD') - TO_DATE('20231201','YYYYMMDD') + 1)


3. LEVEL로 시간 범위 출력

 SELECT TO_TIMESTAMP('01' + (ROWNUM -1) || ':00','HH24:MI') AS TEMP_TIME
   FROM DUAL
CONNECT BY LEVEL <= 23;

SELECT 0 + (ROWNUM -1) AS HOUR
   FROM DUAL
 CONNECT BY LEVEL <= 24

-- 결과는 0 부터 23까지 출력됨

4. 시간 범위를 활용한 예제

-- 입양 시각 구하기
 SELECT A.HOUR
      , COUNT(B.HOUR) AS COUNT
   FROM (
            -- 0부터 23까지 출력
            SELECT 0 + (ROWNUM -1) AS HOUR
              FROM DUAL
           CONNECT BY LEVEL <= 24
        ) A
   LEFT OUTER JOIN 
        (
            SELECT EXTRACT(HOUR FROM CAST(DATETIME AS TIMESTAMP)) AS HOUR
              FROM ANIMAL_OUTS
        ) B
     ON A.HOUR = B.HOUR
  GROUP BY A.HOUR
  ORDER BY HOUR

profile
"Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better."

0개의 댓글

관련 채용 정보