쿼리질문 0 2 1,768

by 오일사마 [SQL Query] [2014.05.15 14:35:49]


and ( :3 = 'I'  and I.InventionID = :4
    or :5 = 'N' and I.InventionTitle like '%' || rtrim(:6) || '%'
    or :7 = 'K' and I.KeyWord like '%' || rtrim(:8) || '%'
    or :9 = 'P' and A.InventionAppNum = :10 )

쿼리 where 조건절 일부 입니다.

or 사용으로 filter로 빠지는데 access 조건으로 타도록 수정을 하고 싶습니다.

도움 부탁드립니다.

4 - filter((:3='I' AND "I"."INVENTIONID"=:4 OR :5='N' AND "I"."INVENTIONTITLE" LIKE '%'||RTRIM(:6)||'%' OR :7='K' AND "I"."KEYWORD" LIKE '%'||RTRIM(:8)||'%' OR :9='P' AND "A"."INVENTIONAPPNUM"=:10) AND (:11='R' AND TO_CHAR(INTERNAL_FUNCTION("I"."FINALAPPROVALDTETME"),'yyyymmdd')>=:12 AND TO_CHAR(INTERNAL_FUNCTION("I"."FINALAPPROVALDTETME"),'yyyymmdd')<=:13 OR :14='P' AND TO_CHAR(INTERNAL_FUNCTION("A"."APPDATE"),'yyyymmdd')>=:15 AND TO_CHAR(INTERNAL_FUNCTION("A"."APPDATE"),'yyyymmdd')<=:16))

by 비주류 [2014.05.15 15:16:25]

OR 을 UNION ALL 로 푸는 /*+ use_concat */ 힌트를 적용하시면 되겠지만,

SQL 다른 부분때문에 적용하기 힘들거나, 잘 풀리지 않으면,

명시적으로 UNION ALL 로 쪼개셔도 좋겠습니다.

하지만, 아시다시피 아래 두 조건은 앞쪽 '%' 때문에 인덱스를 이용할 수 없을 것 같습니다.

필요하다면 협의를 통해 앞쪽 '%'는 빼주시는게 좋을 것 같습니다.

or :5 = 'N' and I.InventionTitle like '%' || rtrim(:6) || '%'
or :7 = 'K' and I.KeyWord like '%' || rtrim(:8) || '%'

 


by 오일사마 [2014.05.15 15:55:13]
문제를 어렵게 풀려고 했네요..
도움 감사드립니다.

SELECT /*+ USE_CONCAT */ 
FROM DUAL 
WHERE 1=1 
and (( :3 = 'I' and I.InventionID = :4) 
or (:5 = 'N' and I.InventionTitle like '%' || rtrim(:6) || '%') 
or (:7 = 'K' and I.KeyWord like '%' || rtrim(:8) || '%') 
or (:9 = 'P' and A.InventionAppNum = :10 ) )

 

 

 

 

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입