【问题标题】:Dynamic Column Name for a Derived Column - ORACLE SQL派生列的动态列名 - ORACLE SQL
【发布时间】:2020-02-06 02:11:42
【问题描述】:

我正在尝试使用“从双重选择”在我的查询中设置动态列名。 这可能吗?如果没有,请为我推荐替代方案来实现这一目标。 我在普通的选择查询中需要这个,而不是使用存储过程。

我正在尝试实现以下查询:

SELECT  A.NO
        ,A.SUB_NO
        ,A.DCY
        ,A.STATE

        ,NVL(TO_CHAR(M1.NUMERATOR),'0') AUG_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M1.DENOMINATOR),'0') AUG_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_DEN' FROM DUAL

        ,NVL(TO_CHAR(M2.NUMERATOR),'0') JUL_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M2.DENOMINATOR),'0') JUL_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_DEN' FROM DUAL

        ,NVL(TO_CHAR(M3.NUMERATOR),'0') JUN_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M3.DENOMINATOR),'0') JUN_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_DEN' FROM DUAL

        ,M1.M1_CALC
        ,M2.M2_CALC
        ,M3.M3_CALC

FROM A, M1,M2,M3;

提前感谢您的帮助。

【问题讨论】:

  • 读取,例如,execute immediate 1st2nd
  • 问题是立即执行需要PL/SQL。
  • 您在 Oracle 18c 中吗?您可以使用多态表函数来做到这一点,但我真的想知道它是否值得。如果你在 18c,我可以为你写一个例子。否则,不会。此外,与动态命名列的情况一样,如果客户端程序不提前知道名称,您需要质疑客户端程序将如何使用/使用此结果集。通常,最好保持 SQL 结果列静态并在用户界面中处理重命名。
  • @MatthewMcPeak,我在使用 Oracle 10G。
  • @JCBA 如果您有一个调用 PL/SQL 对象的普通选择查询,这是否足够好? My open source project可以在SQL中提供动态SQL,但是需要先安装对象。

标签: sql oracle plsql


【解决方案1】:

我敢肯定,使用UNION ALL 最接近您想要的结果。

SELECT NULL no,
       NULL sub_no,
       NULL dcy,
       NULL state,
       TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_NUM' AUG_NUM,
       TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_DEN' AUG_DEN,
       TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_NUM' JUL_NUM,
       TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_DEN' JUL_DEN,
       TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_NUM' JUN_NUM,
       TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_DEN' JUN_DEN,
       NULL M1_CAL,
       NULL M2_CALC,
       NULL M3_CALC
FROM dual
UNION ALL
SELECT  A.NO
        ,A.SUB_NO
        ,A.DCY
        ,A.STATE

        ,NVL(TO_CHAR(M1.NUMERATOR),'0') AUG_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M1.DENOMINATOR),'0') AUG_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-2),'MON')||'_DEN' FROM DUAL

        ,NVL(TO_CHAR(M2.NUMERATOR),'0') JUL_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M2.DENOMINATOR),'0') JUL_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-3),'MON')||'_DEN' FROM DUAL

        ,NVL(TO_CHAR(M3.NUMERATOR),'0') JUN_NUM     --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_NUM' FROM DUAL
        ,NVL(TO_CHAR(M3.DENOMINATOR),'0') JUN_DEN   --AS SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-4),'MON')||'_DEN' FROM DUAL

        ,M1.M1_CALC
        ,M2.M2_CALC
        ,M3.M3_CALC
FROM A, M1,M2,M3;

【讨论】:

  • 谢谢你。我试过了,发现它只会在满足所需列名的地方插入另一行。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多