[SQLD/P] 계층구조 키워드를 활용한 Dynamic Query

Hyo Kyun Lee·2022년 8월 5일
0

SQLD/P

목록 보기
16/82

1. 개요

실무에서 "최근 n개월 이내의 가입한 고객의 수"를 구하고자 할 때, 이 변수 n에 따라 Query 결과가 변화하는 Dynamic Query를 통해 구현한다고 해보자.

이때 핵심은 Dynamic Query, 즉 Query를 손대지 않고도 n변수를 바꾸었을때 동적으로(자동으로) 결과가 나오도록 구현하는 것이다.

  • WHERE DATE IN ('2', '3', '4')
  • WHERE DATE BETWEEN '2' AND '4'

따라서 IN, BETWEEN 등 하드코딩 및 정적인 Query 구성을 통해서는 원하는 결과를 도출할 수 없고, 무엇보다 변수가 바뀔때마다 Query 구성을 다시 수정해야 하는 번거로움이 발생한다.

2. 계층구조 키워드를 활용한 Dynamic Query

이러한 문제에 대한 방안으로 계층구조 키워드와 변수 키워드를 활용하는 방식을 고민해 볼 수 있다.

  • LEVEL

dual table에서(oracle만 가능) LEVEL 키워드를 사용하면, 자체적으로 정수(1,2,3,4...)를 사용할 수 있게 된다.

  • :mon

"최근 n개월"에서 n값은 상황에 따라 대입하는 수가 바뀐다. 이를 변수처리 하기위해(=입력값), 입력 변수값을 설정한다. → 변수 mon = :mon.

3. Query 최종 구성

위 계층구조 키워드를 활용하여, n개월 이내 가입한 고객의 수를 구하는 Query를 구성해보자.

key point : SELECT로 도출되는 여러 개의 (정수 형태의) COLUMN을 그대로 IN 키워드에 사용할 수 있다.

SELECT DATE, count(*)
FROM TABLE
WHERE DATE IN (
	-- n개월 이내, 계층구조 키워드를 활용하는 절
    SELECT SELECT TO_CHAR(ADD_MONTHS(TO_DATE(:today, 'YYYYMMDD'), (LEVEL-1)*(-1), 'MM') --MM형태로 도출)
    FROM DUAL
	CONNECT BY LEVEL <= :mon
)
GROUP BY DATE

4. 참고자료

계층형 쿼리 키워드 - https://grandma-coding.tistory.com/entry/Oracle-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%BF%BC%EB%A6%AC-%EC%89%AC%EC%9A%B4-%EC%A0%95%EB%A6%ACSTART-WITH-CONNECT-BY

0개의 댓글