oracle where조건절에 OR 질문입니다 0 3 2,018

by 김첨지의럭키데이 oracle [2019.05.10 19:06:57]


 WHERE
  (

(PARAM_CATEGORYCODE = 'All' and 1=1)

OR

(PARAM_CATEGORYCODE <> 'All' and CATEGORYCODE LIKE ''|| PARAM_CATEGORYCODE ||'%' )

)

 

화면단에서 콤보박스가 있고 기본이 --전체-- 이고 value는 All입니다. 그 아래로 카테고리가 쭉있고 각자의 코드가 밸류로 설정되어있습니다

그래서 콤보박스를 선택하고 검색시 전체를 선택했을때와 아닐때 를 저런식으로 구분지어서 하고 있지만.. 너무 비효율적인 조건식인거같아서 저걸 좀 튜닝하고 싶은데 

좋은방법이 있을까요?

case 문으로 바꾸는게 더 좋을거같긴한데 그방법말고도 다른 더 좋은방법이 있을지 궁금합니다.

미리 감사드립니다 ㅎㅎ

by 마농 [2019.05.13 08:29:49]

조건 앞에 '' 을 붙일 필요가 없어 보이구요.
조건 뒤에 '%'를 붙이는 이유가 있는지? 의문이네요.
비효율적인 조건식이라고 판단하셨는데. 모양만 보고 판단하면 안되구요.
실제 실행계획을 보고 판단하셔야 할 것 같습니다.
OR 의 대체 방법으로는 UNION ALL 을 이용하는 방법이 있고
DECODE 나 CASE, NVL 등을 이용하는 방법도 있습니다.
다만 인덱스 여부, 널 가능 여부, '%' 를 붙인 이유 등의 고려사항들이 있네요.


by 이준환 [2019.05.13 11:19:06]

 

 

PARAM_CATEGORYCODE가 'ALL'인 경우에는 모두 가져오고,
아닌 경우에는 CATEGORYCODE LIKE PARAM_CATEGORYCODE||'%'인 레코드만 가져오시려 하신 것으로 보입니다.

성능적 관점을 차치하고, 작성하신 조건문을 보다 간단하게 표현하고자 하신다면..

WHERE CATEGORYCODE LIKE NULLIF(PARAM_CATEGORYCODE, 'All')||'%'

 


by 김첨지의럭키데이 [2019.05.14 10:30:41]

답변감사드립니다

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