首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle PL/SQL -基于条件对不同列执行select、group-by、order-by、where-子句的最佳方法?

Oracle PL/SQL -基于条件对不同列执行select、group-by、order-by、where-子句的最佳方法?
EN

Stack Overflow用户
提问于 2016-06-22 14:59:53
回答 2查看 219关注 0票数 0

您好,我有一个问题,这需要我做一个选择不同的列,基于一个条件。我可以在存储过程中使用不干净的IF ELSIF子句来实现这一点,但是我想知道解决这个问题的最好方法。下面是一个更清晰的例子:

代码语言:javascript
复制
PROCEDURE notSoSmartSelect(type IN VARCHAR, a_filter IN VARCHAR
             , b_filter IN VARCHAR, results OUT SYS_REFCURSER) IS
BEGIN
  IF type = 'A' THEN
    OPEN results FOR 
      SELECT a, sum(val) v FROM sample_table
      GROUP BY a, ORDER BY a;
  ELSIF type = 'B' THEN
    OPEN results FOR 
      SELECT b, a, sum(val) v FROM sample_table
      WHERE a = a_filter
      GROUP BY b, a, ORDER BY a, b;
  ELSIF type = 'C' THEN
    OPEN results FOR 
      SELECT c, b, a, sum(val) v FROM sample_table
      WHERE a = a_filter AND b = b_filter
      GROUP BY c, b, a, ORDER BY a, b, c;
  END IF;
END;

正如您已经注意到的,在每种情况下,所使用的表都是相同的,但是使用了不同的列来获取、过滤、分组和排序。

上面的代码看起来很简单,但实际的问题有很多分支,并且有多个if-else,这使得代码非常脏。有没有一种优雅而干净的方法来解决这个问题呢?也许是动态SQL?但我似乎找不出为此编写动态sql的最好方法。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-06-22 15:27:10

我不认为这是“不干净的”。这些查询彼此非常不同,所以我不会尝试将它们合并到一条语句中。

但是考虑到它们是如此不同(不同的列选择,不同的聚合组,不同的where子句),为什么它们都在一个过程中?如果有的话,我会将此过程设置为三个;可能是三个视图。

票数 1
EN

Stack Overflow用户

发布于 2016-06-22 15:41:20

这比您想尝试的动态sql方法清晰得多。如前所述,您有许多IF ELSE分支,甚至构造这么多和"TEST"这么多条件都会变得非常乏味。

在我看来,任何前端应用程序(如JAVA )都会使用您的refcursor,因此最好返回整个输出,然后从该端执行所有操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37960725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档