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