안녕하십니까 sql 초보입니다.
SELECT a,b
FROM tb
WHERE a IN
{'1','2','','4'}
원하는 결과
a b
-------
1 z
2 x
4 y
in으로 ''조회시 결과값이 안나오고 row만 차지하도록 하고 싶습니다.
rownum,nvl으로 어째하면 될 것 같은데 잘 모르겠네요..
(추가) 조회 건수가 약 1000건입니다.
보안상 임시 테이블 생성은 불가해서 dual로 처리해야 합니다.
WITH tb AS (-- 검색 대상 테이블 -- SELECT '1' a, 'z' b FROM dual UNION ALL SELECT '2', 'x' FROM dual UNION ALL SELECT '4', 'y' FROM dual ) , tmp AS (-- 입력 조건 값 집합 생성 -- SELECT 1 rn, '1' a FROM dual UNION ALL SELECT 2, '2' FROM dual UNION ALL SELECT 3, '' FROM dual UNION ALL SELECT 4, '4' FROM dual ) -- 입력 조건 값 집합을 생성하여 원본 데이터와 아우터 조인 SELECT a.a , b.b FROM tmp a , tb b WHERE a.a = b.a(+) ORDER BY a.rn ;
입력 조건용 임시테이블을 생성하기에는 조회건수(약 1000건)가 너무 많습니다..
쿼리보단 프로그램에서 처리하는게 맞을 것 같은데요
IN 절의 최대 갯수 제한(1000개) 있는건 아시는지요?
1000 개의 IN 절은 어떻게 만들어 지나요? 프로그램에서 동적으로 만드는것 아닌가요? IN 절 만들 듯이 UNION ALL 만들면 되는 것 아닌지요?
1000 개의 자료는 어디서 가져오나요? 혹시 테이블에서 특정 조건으로 가져온다면? 테이블을 직접 서브쿼리로 사용하는게 좋습니다.
이 쿼리의 목적은 엑셀 자료작성에 있습니다.
IN절의 1000개의 자료 또한 엑셀로 받아서 CONCATENATE하여 만든 자료입니다.
(=CONCATENATE("'",A1,"',") 이런식)
엑셀 CONCATENATE로 UNION ALL문 작성해서 원하는 결과는 얻었습니다.
(Toad, 결과를 엑셀로 뽑음)
--------------------------------------------------------------
* 질문 요지는 이 문제를 rownum,nvl 등을 사용하여 쿼리로 해결할 수 있는지 궁금했습니다.
rownum a b
------------
1 1 z
2 2 x
3
4 4 y
select 결과가 없으면 b는 '' 또는 * 또는 null 등등 구분가능 값을 나오게
하고 싶은 느낌이었는데..잘 안되었네요
댓글을 통해 많이 배워갑니다~