2009-12-15 4 views
2

다음과 같은 문제가, 나는 오아시스에서 "활용률을 퍼센트로"계산하는보기를 만들고 싶습니다.오라클보기 문제가 선택 및 0으로

AS SELECT 
    sw.SWITCH_ID, 
    sw.ASSET_ID, 
    sw.SYSTEMNAME, 
    sw.MAX_INSTALLABLE_PORTS, 
    sw.INSTALLED_PORTS, 
    sw.USED_PORTS, 
    (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100 AS UTIL_INSTALLED_PORTS, 
    sw.RES_INFRASTRUCTURE_PORTS, 
    sw.USED_INFRASTRUCTURE_PORTS, 
    sw.FREE_INFRASTRUCTURE_PORTS, 
    (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100 AS UTIL_INFRASTRUCTURE_PORTS, 
    sw.RESERVED_DEVICE_PORTS, 
    sw.USED_DEVICE_PORTS, 
    sw.FREE_DEVICE_PORTS, 
    (sw.FREE_DEVICE_PORTS/sw.RESERVED_DEVICE_PORTS)*100 AS UTIL_DEVICE_PORTS, 
    sw.RUN_DATE 

문제 :

if (sw.INSTALLED_PORTS or sw.MAX_INSTALLABLE_PORTS == null) 
     UTIL_INSTALLABLE_PORTS = null 
else (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100 AS UTIL_INSTALLABLE_PORTS, 

답변

4

NULL로 나누기는 0으로 나누기와 다릅니다 (제목에서 문제를 참조하는 것과 같습니다).

select 1/null from dual = null이
select null/null from dual = null이

그래서 당신은 자동으로 (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100으로 원하는 것을 얻을 수 있습니다.

내가 생각하기에 문제는 sw.MAX_INSTALLABLE_PORTS이 0 일 때라고 생각합니다.

case 
    when sw.MAX_INSTALLABLE_PORTS = 0 then null 
    else (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100 
end 
+0

당신은 위대합니다! 덕분에 – opHASnoNAME

4
CASE 
    WHEN sw.INSTALLED_PORTS IS NULL OR sw.MAX_INSTALLABLE_PORTS IS NULL THEN NULL 
    ELSE (sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100 
END UTIL_INFRASTRUCTURE_PORTS 
: 때때로 sw.INSTALLED_PORTS 또는 sw.MAX_INSTALLABLE_PORTS는

같은 일을 할 수있는 좋은 방법이 있나요 .. (다른 UTIL 행에 대한 동일) NULL 일 수있다
2

다음과 같이 인수에서 0이 아닌 첫 번째 null을 반환하는 COALESCE()를 사용할 수 있습니다.

(COALESCE(sw.INSTALLED_PORTS, 0)/COALESCE(sw.MAX_INSTALLABLE_PORTS,1))*100 
AS UTIL_DEVICE_PORTS 

분모의 합체 기본값으로 1을 사용 했으므로 대신 DIVIDE/0을 사용하지 마십시오.

+0

나는 그것이 같은 것이라고 생각하지 않습니다. sw.INSTALLED_PORTS 또는 sw.MAX_INSTALLABLE_PORTS가 null 인 경우 UTIL_INSTALLABLE_PORTS가 null이되기를 원합니다. 귀하의 코드는 다음과 같은 경우 0을 반환하지만 OP의 코드에 따르면 결과는 NULL이어야합니다 : SELECT (COALESCE (NULL, 0)/COALESCE (NULL, 1)) * 100 AS UTIL_DEVICE_PORTS 이중에서 – dcp

+0

fair comment that man –

5

또는 약간 짧은 :이 경우 다음과 같은 사용할 수 있습니다

sw.INSTALLED_PORTS/NULLIF(sw.MAX_INSTALLABLE_PORTS,0) 

안부, 롭.

+0

+1에 대한 'NULLIF' – pilcrow