Oracle解码替代

时间:2016-12-22 10:24:02

标签: sql oracle

我需要在输出中用NA替换0值。我尝试过的解决方案是使用DECODE。但对于表达式来说,它太冗长了。类似于下面

DECODE(round((A.DollarsunderAvgPrice/A.VolumeSales*100)
                /(E.DollarsunderAvgPrice/E.VolumeSales*100)
             ,3)
      ,0,
      'NA',
      round((A.DollarsunderAvgPrice/A.VolumeSales*100)
              /(E.DollarsunderAvgPrice/E.VolumeSales*100)
           ,3)
      )

所以我正在寻找替代解决方案。理想情况下如下。

DECODE(VALUE,COMAPAREVALUE,COMPARE_TRUEVALUE)

if false VALUE本身。

与以下答案不同,我希望尽可能避免SubqueryCTE甚至case expressions。因为查询已经返回了很多列,并且有很多类似的表达式,所以查询会变得更大

4 个答案:

答案 0 :(得分:4)

正如评论部分所述,这在SQL中通常不应该做,因为SQL只是为了获取数据。如果要显示该数据,您可以使用某些程序或网站来处理此问题。但是对于快速解决方案,您可以使用

nvl(to_char(nullif(<expression>,0)),'NA') 

首先将零转换为null,然后将null转换为&#39; NA&#39;。您可能还想在TO_CHAR中指定格式。

答案 1 :(得分:2)

先准备好数据,然后执行decode

with d as (select round((A.DollarsunderAvgPrice/A.VolumeSales*100)/(E.DollarsunderAvgPrice/E.VolumeSales*100),3) val from your_table)
select decode(val, 0 , 'NA', val) from d;

答案 2 :(得分:1)

如何在子查询中进行计算并在外部应用解码:

select decode(x, 0, 'NA', to_char(x)) from
(select round((A.DollarsunderAvgPrice/A.VolumeSales*100)/(E.DollarsunderAvgPrice/E.VolumeSales*100),3) x
from my_table);

或CTE:

with t as (select round((A.DollarsunderAvgPrice/A.VolumeSales*100)/(E.DollarsunderAvgPrice/E.VolumeSales*100),3) x
    from my_table)
select decode(x, 0, 'NA', to_char(x)) from t;

可能是CASE

with t as (select round((A.DollarsunderAvgPrice/A.VolumeSales*100)/(E.DollarsunderAvgPrice/E.VolumeSales*100),3) x
    from my_table)
select case when x = 0 then 'NA' else to_char(x) end from t;

<子> 附: - 在上述查询中获得结果时,使用适当的强制转换是一种很好的做法,例如to_char()

答案 3 :(得分:0)

怎么样:

SELECT DECODE(X,0,'NA',X)
  FROM (SELECT round((A.DollarsunderAvgPrice/A.VolumeSales*100)/(E.DollarsunderAvgPrice/E.VolumeSales*100),3) AS X
        FROM dual);