我需要在输出中用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本身。
与以下答案不同,我希望尽可能避免Subquery
,CTE
甚至case expressions
。因为查询已经返回了很多列,并且有很多类似的表达式,所以查询会变得更大
答案 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);