以下问题,我想在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,
答案 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。