database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 31528 게시물 읽기
No. 31528
WHERE절에서 동적으로 검색할 컬럼이 바뀔경우에는?
작성자
잔대가리
작성일
2007-08-02 20:48ⓒ
2007-08-02 21:07ⓜ
조회수
2,899

패키지를 작성하고 있습니다.
패키지에는 인풋파라미터를 7개 받습니다.

그중 2개가 검색할 대상을 동적으로 바뀌게 만듭니다.
예를들면 
pColumn in vachar2(10)
pStr in varchar2(10)

이렇게 있습니다.

만약 
pColumn 값이 1이면 A라는 테이블에서 A1이라는 컬럼을 비교해야하고
pColumn 값이 2이면 B라는 테이블에서 B1이라는 컬럼을 비교해야하고
pColumn 값이 3이면 C라는 테이블에서 C1이라는 컬럼을 비교해야합니다.
값비교는 = 이 아니라 LIKE로 비교해 주어야합니다.

where 조건문에서 어떻게 처리해야 할까요?
초보의 길 탈출은 왜 이리 함든지...

이 글에 대한 댓글이 총 5건 있습니다.

크게 두가지 방법이 있을 것 같군요.

첫번째, 동적쿼리를 생성한다.
           HARD PARSHING이 발생할 수 있군요. 조심...
두번째, 쿼리 3개를 UNION ALL로 묶어서 하나의 쿼리를 생성한다.
           이경우 조건값에 따라 3개의 쿼리중 하나만 동작하도록 하면 부하가 적을것 같네요.
           SELECT *
           FROM (
                         SELECT ...
                         FROM    A
                         WHERE :pColumn = 1
                         AND     A1 = ...
                         UNION ALL
                         SELECT ...
                         FROM    B
                         WHERE :pColumn = 2
                         AND     B1 = ...
                         UNION ALL
                         SELECT ...
                         FROM    C
                         WHERE :pColumn = 3
                         AND     C1 = ...
                      )

@_@일호

김일호(kimilho)님이 2007-08-02 21:10에 작성한 댓글입니다.
이 댓글은 2007-08-02 21:11에 마지막으로 수정되었습니다.

네 저도 그렇게는 생각을 하고 있는데...
최대한 간단하게 할 수 있는 방법이 없을까요?
첫번째 Hard Parsing 쪽은 왠지 좀 꺼려지고
두번째 방법도 생각을 해봤는데 것도 쿼리가 좀 길어질거 같고

어떤 다른 좋은 방법이 없을까요? ^^

잔대가리님이 2007-08-02 21:14에 작성한 댓글입니다. Edit

동적쿼리로 작성하시고 pStr에 대해서만 바인딩 해주면

하드파싱 있어봤자 칼럼개수만큼이니 크게 고려하지 않아도 됩니다.

이호한(miplus)님이 2007-08-02 23:38에 작성한 댓글입니다.

제가 저상황이라면

pColumn가 1,2,3말고도 계속 늘어나는거면 꺼림직해도 동적으로 처리를 해야 할것 같구요.

1,2,3만 있는거라면 보기좋지 않지만 예쁘게 줄 맞춰서 union all을 쓰겠습니다.

자스민님이 2007-08-03 00:56에 작성한 댓글입니다. Edit

저도 한마디 첨언하자면,

보통은 다른 분들이 언급하신 두 방법 외에는 없을 듯 합니다.
쿼리가 길어진다고 반드시 성능도 나빠지는 것은 아닙니다.
위 처럼 테이블까지 동적으로 구성되는 요건이라면,
성능면을 중시하면 쿼리가 좀 길어지더라도 UNION ALL로 구성하는 것이 바람직합니다.

결국 데이터량, Critical Access Path등의 상황을 고려하여 
성능을 더 우선시 하느냐 -> UNION ALL 구성
성능은 괜찮으니 쿼리를 심플하게 하느냐 -> 동적쿼리 구성

잘 판단해서 선택하셔야겠죠...;

단, 위의 각 테이블간의 연결고리가 존재하고 데이터구조상 Group By등의 처리없이 바로 연결이 가능하다면 View-Merging이 될 수 있는 정도의 전략적인 View를 만들어 활용하는 것도 고려할 수는 있겠군요...참고하세요...;

건승하시길...수고하세요~~

성시현(finecomp)님이 2007-08-03 09:31에 작성한 댓글입니다.
이 댓글은 2007-08-03 10:11에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
31532order by 정렬 후 rownum 참조 [2]
리무진
2007-08-03
4624
31531함수만들때 다른곳 테이블 사용불가능하나요? [4]
!!
2007-08-03
1994
31529insert하는 테이블을 select하면 속도에 영향을 미치나요? [1]
오라클
2007-08-03
2170
31528WHERE절에서 동적으로 검색할 컬럼이 바뀔경우에는? [5]
잔대가리
2007-08-02
2899
31527START WITH이거 좀 해결해주세요~ [3]
..
2007-08-02
2202
31526CLOB 항목을 UPDATE중 에러입니다. [3]
black
2007-08-02
2803
31525아웃터조인시 오른쪽 테이블값 하나만 가져오기 [2]
이창형
2007-08-02
2588
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다