Oracle 如何使用相同的Select语句获取不同的表列

Oracle 如何使用相同的Select语句获取不同的表列,oracle,plsql,oracle12c,Oracle,Plsql,Oracle12c,Hi有一个表,其中有9列具有相同的数据类型(都是百分比值)。我试图在PL\SQL函数中创建一个Select语句,根据外部参数值返回3的元组 在句法上,类似这样的东西: WITH tmp AS (SELECT '1' col1, '2' col2, '3' col3, '4' col4, '5' col5, '6' col6,

Hi有一个表,其中有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;
或者,使用union实现三个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语句?每种解决方案的优缺点是什么?

如果您不能在运行时基于
externalparameter
有选择地运行三个单独查询中的一个,那么使用
case
表达式的选项一是更干净的解决方案

联合体的问题
解决方案:

  • 检查生成的查询计划以确定,但我认为它将执行三个独立的select语句,尽管它们是互斥的。(除非12c比我迄今为止所用的查询优化要聪明得多。)这是因为该计划可能会被重用,所以该计划必须包括所有三个选择,以便在所有情况下都有正确的选择
  • union
    版本包含一个隐式distinct,如果第一个版本中的内容已经不同,那么它会增加工作。或者相对于第一个版本更改结果

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

    这种方法听起来有点胡闹。相反,我会考虑一个单一的过程,它封装一个返回所有行的SQL,然后用过程或PraceCeCs包对此进行解释,并返回适当的行。