2012-02-14 5 views
0

:SQL의 DECODE 최적화

ta.COD_ACT_MCH= ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL) 

이 그것을 할 수있는 방법이 있나요? 또는 함수를 두 번 호출합니까? 이것을 어떻게 최적화 할 수 있습니까?

ta.COD_ACT_MCH=DECODE(ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL), 
'N', 
' ', 
ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL)) 

답변

0

해킹 작동합니다 :

NVL(NULLIF(
    ALIMENTATION_COD_ACT_MCH(ta.CA_DDE_TYP_DDE,tb.COD_SECVTE,tb.NUM_FOU1,ta.CA_COD_ENSCIAL), 
    'N'), '') 
+0

오라클에서 빈 문자열은 null로 평가되므로 NVL (whatever, '')이 쓸데없는 것입니다. – Allan

1

DETERMINISTIC/RESULT CACHE 절을 함수 ALIMENTATION_COD_ACT_MCH에 추가하십시오. 따라서 선택 목록에서 두 번 이상 사용할 수 있지만 오라클은 한 번만 함수 결과를 계산합니다. ALIMENTATION_COD_ACT_MCHNULL을 반환 할 수 있습니다하지 않는 한

+0

RESULT_CACHE는 11g와 함께 작동합니다. 10x. – Samson

+0

함수가 실제로 결정적 일 경우에만 'DETERMINISTIC'을 추가하십시오. 그렇지 않은 경우 (예 : 테이블의 값을 조회하는 경우) 잘못된 결과가 표시 될 수 있습니다. – Allan