짧은 decode 함수 질문입니다. 0 5 2,587

by ㈜소근소근™ [Oracle 기초] decode [2012.08.02 16:52:35]





and DECODE(sign(CNT-3), case when (case when A.SPL_ASIS_DN_DT is null then to_char(A.SPL_REQUEST_DATE, 'YYYY-MM-DD') else to_char(A.SPL_ASIS_DN_DT, 'YYYY-MM-DD') end) = to_char(C190.DUTYDAT,'YYYY-MM-DD') then '1' else '0' end,'1') = '1'




아래소스는 when절 일부분입니다.


쟁점 1. decode sign 형식이 맞느지... -구현하고자하는건 cnt > 3 이면 case when ~


쟁점 2. case when 구문이 맞는지도 한번 봐수에용
by 마농 [2012.08.02 17:35:13]

 문법상 틀린건 없습니다만...
문제는 논리상 요구조건에 부합하느냐? 하는거죠...
소스코드가 너무 복잡합니다.
요구사항은 의외로 간단할것같은 예감이 드네요...
맞는지 틀린지 본인도 모르겠는 복잡한 코드를 줄이는 것보다는
요구사항을 설명해 주시고 새로 작성해 보는것이 나을듯 합니다.


참고로 제일 안쪽 Case 문을 간단하게 고쳐보면...
-- 변경전 : 불필요한 Case 사용으로 to_char 함수 두번 사용 --
case when A.SPL_ASIS_DN_DT is null
then to_char(A.SPL_REQUEST_DATE, 'YYYY-MM-DD')
else to_char(A.SPL_ASIS_DN_DT, 'YYYY-MM-DD')
end
-- 변경후 : case 문 제거 및 nvl 사용으로 to_char 한번만 사용 --
TO_CHAR(NVL(a.spl_asis_dn_dt, a.spl_request_date), 'yyyy-mm-dd')


또한 조건이 맞으면 case 로 결과 가져와 다시 비교하는 방식이 이상하네요.
여러 조건을 순차로 비교확인하려면 그냥 조건식을 and로 연결하면 됩니다.
AND cnt > 3
AND TO_CHAR(NVL(a.spl_asis_dn_dt, a.spl_request_date), 'yyyy-mm-dd')
  = TO_CHAR(c190.dutydat, 'yyyymmdd')


by ㈜소근소근™ [2012.08.02 17:57:11]
마농님 정말 감솨합니다.
정말감사합니다.
select A.*, B.cnt
from A,B
where 
and 조건1 
and 조건2
and 조건3
제가 생각하고 만든 쿼리는 이렇습니다.
B.cnt >3 일때 조건3를 실행하고(조건1+조건2+조건3)
그렇지 않으면...패스..(조건1+조건2)만실행
이런 바탕위에 쿼리를 만들었씁니다.        

by 손님 [2012.08.02 18:12:03]

AND DECODE(SIGN(CNT-3) ,1 ,CASE WHEN TO_CHAR(NVL(A.SPL_ASIS_DN_DT ,A.SPL_REQUEST_DATE),'YYYY-MM-DD') = TO_CHAR(C190.DUTYDAT,'YYYY-MM-DD') THEN '1' 
                                ELSE '0' 
                           END ,'1') = '1'

이렇게 하면 어떨런지요?

by ㈜소근소근™ [2012.08.02 18:16:31]
감사합니다.

저도빨리 답변을 달수 있는 자가 되야겠어요


by 마농 [2012.08.02 18:52:42]
and 조건1 
and 조건2
and
(
b.cnt <= 3
OR
조건3
)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입