如何使用 CASE、DECODE 和/或 NVL 返回值
Posted
技术标签:
【中文标题】如何使用 CASE、DECODE 和/或 NVL 返回值【英文标题】:How to Return a Value using CASE, DECODE, and/or NVL 【发布时间】:2014-06-10 21:14:45 【问题描述】:我遇到了一些麻烦。我需要一个公式,无论这些值是否为 NULL 和/或 0,都能给我一个实际结果。请参阅以下内容;
SELECT
[...columns...],
(NVL(SUM(table1.qty_rtnd), 0) + NVL(SUM(table1.qty_defective), 0)) / CASE (NVL(table1.sales, 0)) WHEN 0 THEN 1 END AS six_wk_pct_defective,
[...more columns...]
此特定实例中的值:
table1.qty_rtnd = NULL
table1.qty_defective = 7
table1.sales = 560
如果 CASE 语句不在此公式中且除数为 0,Oracle SQL Developer 会向我抛出一个错误,告诉我不能除以零。很好,但是当我尝试将 CASE 语句应用于该公式的被除数部分时,查询结果中的字段在不应该为 NULL 时为 NULL(在这种特殊情况下,数学使其应该为 0.0125) .
我做错了什么?如何使用 CASE、NVL、DECODE 或任何其他功能来解决此问题?
谢谢,
-蚂蚁
更新:
对于那些寻找答案的人。一个是由以下人员提供的;
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (NULLIF (sales, 0), 1) FROM table1
【问题讨论】:
您在同一个查询中混合了 SUM 和单个值。其次,您有 qty_rtnd、qty_defective 和 sales 的一些示例值吗? 当这个公式的除数不为 0 时,SUM 似乎不是问题。我用列值的示例更新了这篇文章。 您发布的示例值似乎与您在添加CASE
语句之前表示您收到的错误不一致。如果table1.sales
是 560,则分母没有理由为 0,因此没有理由引发除以 0 错误。此外,如果您有单个值,似乎没有任何理由在分母中使用 SUM
函数。
【参考方案1】:
怎么样
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (sales, 1) FROM table1
或
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (NULLIF (sales, 0), 1) FROM table1
保障销售=0
【讨论】:
如果sales
为 0,则会引发错误。不知道实际值是多少,很难确定这是否是一个真正的问题。但这是一个潜在的问题。
您为我提供的第二个解决方案效果很好。谢谢!【参考方案2】:
由于您没有向我们提供测试用例,因此很难理解您在这里问什么。例如,您没有告诉我们各个列具有什么值。您告诉我们,显然,期望的结果是 0.0125,但不知道我们应该使用什么输入,我们有点盲目。
如果唯一的问题是你的分母,我怀疑你希望分母是
CASE WHEN NVL( table1.sales, 0 ) = 0
THEN 1
ELSE table1.sales
END
如果猜测不正确,请发布可重现的测试用例来帮助我们。
【讨论】:
原始帖子已更新为列的值。感谢您迄今为止的帮助。以上是关于如何使用 CASE、DECODE 和/或 NVL 返回值的主要内容,如果未能解决你的问题,请参考以下文章