2014-11-10 4 views
4

출발 한 개발자가 작성한 기존 Oracle 쿼리를 분석하려고합니다. 나는 잘 오라클에 정통한 아니에요 그리고 난 (:BV-POS_YEAR 일년에 변수 세트입니다)를 Microfocus COBOL 응용 프로그램에서이 DECODE 기능의 사용에 의해 혼란 조금 해요 :Oracle DECODE versus NVL

SELECT ...., DECODE(DELV_YEAR, NULL, :BV-POS_YEAR, DELV_YEAR), .... 

내가하려고 해요 나는 DECODE 또는 NVL 기능에 대해 뭔가 오해

SELECT ...., NVL(DELV_YEAR, :BV-POS_YEAR), .... 

암 : 그것은 다른 것 방법을 이해? 개발자는 매우 동일한 select 문에서 다른 곳에서 사용되기 때문에 NVL 기능을 알고 있습니다.

+1

동일합니다. 예전에는 9999와 같은 마법의 연도 번호에 대한 특수 처리라고하면 더 많은 조항이있을 수 있습니까? 또는 문자열에 대한 다른 'nvl'모양이 있습니까? 개발자가 숫자에 대해 작동하지 않는다고 생각할 수도 있습니다. –

+0

당신과 Michal 귀하의 답변에 감사드립니다. 코드는 그리 오래되지 않았습니다. 개발자가 특정 null이 아닌 값을 나중에 잠재적으로 다른 의미를 갖는 것으로 보았을 가능성이 있습니다. 나는 단지 내가'DECODE' 또는'NVL'의 일부를 놓치지 않았는지 확인하기를 원했습니다. – Pete

+1

이 함수는 ANSI 표준 버전이기 때문에'COALESCE()'를 사용하라고 조언합니다. –

답변

6

NVL은 지정된 값으로 NULL을 대체합니다.

DECODE은 지정된 값을 원하는 값으로 바꾸고 연결될 수 있습니다. 사용량은 동일하지만 DECODE의 사용 범위가 훨씬 넓습니다. 예를 들어, 당신은 편집

if (supplier_id == 10000) 
{ 
    SELECT 'IBM' 
} else if (supplier_id == 10001) 
{ 
    SELECT 'Microsoft' 
} else if (supplier_id == 10002) 
{ 
    SELECT 'Hewlet Packard' 
} else 
{ 
    SELECT 'Gateway' 
} 

이 의사 코드에 해당이 코드

SELECT supplier_name, 
DECODE(supplier_id, 10000, 'IBM', 
        10001, 'Microsoft', 
        10002, 'Hewlett Packard', 
        'Gateway') result 
FROM suppliers; 

쓸 수 있습니다 다음 NVL과 NULL 교체 DECODE의 성능은 사용자가 측정을하고 그것을 보인다 거의 평등하다.

NULL 교체를해야 할 때 NVL을 사용하는 것이 좋습니다. 조금 더 표현력이 있기 때문입니다.

+0

감사. 나는 시스템이 나를 (너무 빨리 받아들이는데, 분명히) 허락 할 때 이것을 몇 분 안에 받아 들일 것이다. 정교화 할 필요가 없습니다. 그것은'디코드 '가 무엇을했는지에 대한 나의 이해였다. 두 사람은 나에게 상응하는 보였고 나는 단지 내가 뭔가를 놓치지 않았는지 확인하기를 원했습니다. – Pete