选择和除零的Oracle View问题

时间:2009-12-15 13:11:12

标签: sql oracle null view

以下问题,我想在Oracle中创建一个视图,计算“利用率百分比”。

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

问题:有时sw.INSTALLED_PORTS或sw.MAX_INSTALLABLE_PORTS可以为NULL(其他UTIL行相同)..

有什么好方法可以做一些事情:

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 个答案:

答案 0 :(得分:5)

或更短一些:

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

此致 罗布。

答案 1 :(得分: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

答案 2 :(得分:4)

除以NULL与除零相同(因为你引用了标题中的问题)。

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

因此,(sw.INSTALLED_PORTS/sw.MAX_INSTALLABLE_PORTS)*100会自动获得您想要的内容。

我认为,问题是当sw.MAX_INSTALLABLE_PORTS为零时。在这种情况下,您可以使用以下内容:

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

答案 3 :(得分:2)

您可以使用COALESCE()从其参数返回第一个非null,例如:

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

请注意,我在分母中使用1作为合并默认值,而不是想要DIVIDE / 0。