Leeyebin의 블로그

[DB2]파라미터값을 임시로 테이블인 것처럼 사용하기 본문

프로그래밍/SQL

[DB2]파라미터값을 임시로 테이블인 것처럼 사용하기

안되면될때까지 2016. 9. 6. 01:00

말그대로다


파라미터가 '1111' '2222' '3333' '4444' 가 있는데 디비에는 '1111' '3333'만 있다고 가정하면 보통 쿼리에 IN을 사용하게 되면 '1111' '3333'에 대한 결과만 나올 것이다.(IN ('1111', '2222', '3333', '4444'))


내가 개발하는 화면중에 '2222', '4444' 에 대한 결과도 그리드에 나오도록 하는 부분이 있었는데 어떻게 할지 고민했다.

쿼리를 던진 후 돌려받을 때 LIST<VO>에다가 없는 것들을 파라미터부분만 ADD하는 식으로 처리하게 되면 해결은 되지만 코드가 안좋아 보일 것 같아서 쿼리단에서 해결하려고 버둥대던 중 시각화 관련 처리를 맡으시는 선임님께 여쭤봤더니 화두를 던져 주셨다. [WITH AS]


WITH AS란?


[WITH 구문]

- WITH구문내의 쿼리의 결과(SUB쿼리)가 여러번 사용될때(호출될때) 유용하다.

- 서브쿼리 블럭에 이름을 지정할 수 있도록 해줌.

- 오라클 옵티마이저는 쿼리를 인라인뷰나 임시 테이블로 여긴다.
- Oracle 9 이상 지원


[WITH 구문 사용방법]

WITH ALIAS명 AS ( SUB쿼리 )

SELECT 컬럼명 FROM ALIAS명;

 (참조 http://powerofwriting.tistory.com/entry/Oracle-WITH-%EA%B5%AC%EB%AC%B8-%EC%98%88%EC%A0%9C)


이렇다고 한다.

WITH TAB(이름은 임의로) (NO) AS (
SELECT #{a} AS NO
FROM sysibm.sysdummy1
)
SELECT TAB.NO
      ,A.VALUE,
      ,NVL2(A.VLUE, 'Y', 'N') AS INFO_YN
FROM TAB LEFT OUTER JOIN TESTTABLE1 AS A ON TAB.NO = A.NO


그래서 WITH AS 를 사용해서 '1111' '2222' '3333' '4444' 파라미터를 사용해서 테이블처럼 만들고 기존에 테이블과 아우터 조인을 걸게 되면

NO       VALUE      INFO_YN
1111      A            Y
2222      공백         N
3333      B            Y
4444      공백         N

으로 나오게 되고 나머지 데이터 유무처리의 경우에는 칼럼을 추가해 NVL2를 사용해서 Y 혹은 N으로 처리해 주면 될 듯하다.

참고로 내가 개발한 환경은 디비는 DB2이다.



Comments