실무에서 "최근 n개월 이내의 가입한 고객의 수"를 구하고자 할 때, 이 변수 n에 따라 Query 결과가 변화하는 Dynamic Query를 통해 구현한다고 해보자.
이때 핵심은 Dynamic Query, 즉 Query를 손대지 않고도 n변수를 바꾸었을때 동적으로(자동으로) 결과가 나오도록 구현하는 것이다.
따라서 IN, BETWEEN 등 하드코딩 및 정적인 Query 구성을 통해서는 원하는 결과를 도출할 수 없고, 무엇보다 변수가 바뀔때마다 Query 구성을 다시 수정해야 하는 번거로움이 발생한다.
이러한 문제에 대한 방안으로 계층구조 키워드와 변수 키워드를 활용하는 방식을 고민해 볼 수 있다.
dual table에서(oracle만 가능) LEVEL 키워드를 사용하면, 자체적으로 정수(1,2,3,4...)를 사용할 수 있게 된다.
"최근 n개월"에서 n값은 상황에 따라 대입하는 수가 바뀐다. 이를 변수처리 하기위해(=입력값), 입력 변수값을 설정한다. → 변수 mon = :mon.
위 계층구조 키워드를 활용하여, 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