【问题标题】:How to get different table columns using the same Select statement如何使用相同的 Select 语句获取不同的表列
【发布时间】:2017-04-10 16:46:52
【问题描述】:

您好,有一个包含 9 列的表,这些列具有相同的数据类型(都是百分比值)。我正在尝试在 PL\SQL 函数中创建一个 Select 语句以返回 3 的元组,具体取决于外部参数值。

语法上是这样的:

WITH tmp
     AS (SELECT '1' col1,
                '2' col2,
                '3' col3,
                '4' col4,
                '5' col5,
                '6' col6,
                '7' col7,
                '8' col8,
                '9' col9
           FROM DUAL
         UNION
         SELECT '10' col1,
                '20' col2,
                '30' col3,
                '40' col4,
                '50' col5,
                '60' col6,
                '70' col7,
                '80' col8,
                '90' col9
           FROM DUAL
         UNION
         SELECT '100' col1,
                '200' col2,
                '300' col3,
                '400' col4,
                '500' col5,
                '600' col6,
                '700' col7,
                '800' col8,
                '900' col9
           FROM DUAL)
SELECT CASE
           WHEN externaparameter = 1 THEN (col1, col2, col3)
           WHEN externaparameter = 2 THEN (col4, col5, col6)
           WHEN externaparameter = 3 THEN (col7, col8, col9)
       END
  INTO var1, var2, var3
  FROM tmp;

对此我有两种解决方案:

为每一列实现 CASE 语句。但它会创建一个很大的 select 语句,并且可能会造成混淆。

SELECT CASE
           WHEN externaparameter = 1 THEN col1
           WHEN externaparameter = 2 THEN col4
           WHEN externaparameter = 3 THEN col7
       END,
       CASE
           WHEN externaparameter = 1 THEN col2
           WHEN externaparameter = 2 THEN col5
           WHEN externaparameter = 3 THEN col8
       END,
       CASE
           WHEN externaparameter = 1 THEN col3
           WHEN externaparameter = 2 THEN col6
           WHEN externaparameter = 3 THEN col9
       END
  INTO var1, var2, var3
  FROM tmp;

或者,用一个联合执行三个 select 语句。但是我的原始查询有几个 WHERE 条件,对于这种情况,我需要重复它们。

SELECT a, b, c
  INTO var1, var2, var3
  FROM (SELECT col1 a, col2 b, col3 c
          FROM tmp
         WHERE externalparameter = 1
        UNION
        SELECT col4 a, col5 b, col6 c
          FROM tmp
         WHERE externalparameter = 2
        UNION
        SELECT col7 a, col8 b, col9 c
          FROM tmp
         WHERE externalparameter = 3)

对于这个问题,我有没有更简洁的 Select 语句?每种解决方案的优缺点是什么?

【问题讨论】:

  • 这种方法听起来有点做作。相反,我会考虑使用单个过程来封装返回所有行的单个 SQL,然后用过程或过程包装它以解释参数并返回适当的行。

标签: oracle plsql oracle12c


【解决方案1】:

如果您无法在运行时根据externalparameter 选择性地运行三个单独的查询之一,那么使用case 表达式的选项一是更简洁的解决方案。

union 解决方案的问题:

  1. 检查生成的查询计划以确保,但我想它会执行三个单独的选择语句,尽管它们是互斥的。 (除非 12c 比我迄今为止所说的查询优化要智能得多。)这是因为该计划可能会被重用,因此该计划必须包括所有三个选择才能在所有情况下都有正确的选择。
  2. union 版本包含一个隐含的 distinct,如果第一个版本中的内容已经不同,则可以添加工作。或更改结果与第一个版本。

在这种情况下有时会使用动态 SQL,但我认为有选择地运行三个静态语句会比构建动态 SQL 字符串更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2021-06-06
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多