【问题标题】:PL SQL - How to use select statement inside for loop with conditional return?PL SQL - 如何在带有条件返回的 for 循环中使用 select 语句?
【发布时间】:2019-09-06 23:17:32
【问题描述】:

这是用于 Oracle 数据库的 PL SQL。我想使用 for 循环来识别在某些商店没有预测(值为 0)但在其他商店有一些预测(值大于 0)的项目。 最简单的方法似乎是首先选择不同的项目。然后对于每个项目,如果有一些商店有 AND 一些商店没有预测,则识别使用条件。

所有这些数据都在一张表上,即每家商店的每件商品的预测。我从未构建过 PLSQL for 循环。你能帮我在 PL SQL 中构造它吗?我必须使用存储过程吗?伪代码如下所示:


FOR i IN (SELECT DISTINCT Item FROM TABLE)
  IF 
     ( ( SELECT COUNT(*) WHERE Forecast = 0 ) > 0
   AND ( SELECT COUNT(*) WHERE Forecast > 0 ) > 0
  THEN
     PRINT Item Name
End Loop

谢谢!

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。此外,您不需要 while 循环。

标签: sql oracle for-loop plsql


【解决方案1】:

您可以使用单个查询来获取以下项目:

Select item
From table
Group by item
Having (sum(case when forecast = 0 
then 1 end) > 0
And sum(case when forecast > 0 
then 1 end) > 0)

如果您希望它在for loop 中使用,那么应该采用以下方法:

SET SERVEROUT ON
Begin
For i in (Select item
    From table
    Group by item
    Having (sum(case when forecast = 0 
    then 1 end) > 0
    And sum(case when forecast > 0 
    then 1 end) > 0))
Loop
DBMS_OUTPUT.PUT_LINE(I.ITEM);
End loop;

End;
/

干杯!!

【讨论】:

  • 非常感谢!我忘了回复,但这是非常有用的建议。我用它来构建我的查询。
【解决方案2】:

我认为您可以使用聚合查询来做您想做的事情。假设预测永远不会是负数,您可以获得具有零和非零预测值的项目:

select item
from forecasts
group by item
having min(forecast) = 0 and max(forecast) > 0;

当然,您可以将其放入循环中以“打印”出值。我看不出这样做的价值,除非您出于其他原因致力于 PL/SQL 代码。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 2018-03-07
    • 1970-01-01
    • 2019-08-31
    • 2022-11-26
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多