首页 > 解决方案 > 选择带有变量的列名

问题描述

我有一个包含 10 列的表,名称为:cost201907、cost201906、cost201905 ......

我想在今天的月份和年份中放入一个变量:a = 201907

define a = to_char(SYSDATE, 'yyyy')|| to_char(SYSDATE, 'mm') from dual;

SELECT &a;

output: a = 201907

我的目标是使用此变量选择一列。

每个月运行一个脚本,在变量中给我今天的日期,

并在使用它使用 select 语句选择最近的列之后,例如:

Select  'cost'||a  from Table1.

可能我会使用 PL/SQL 但仍然找不到方法。请帮我。

标签: oracle-sqldeveloper

解决方案


您可以使用替换变量,但您需要稍微不同地填充它,正确形成列名。

在你使用的那一刻define,它给出a了你设置的整个字符串的值;然后您的选择将整个字符串作为替换,您可以通过以下方式看到set verify on

SELECT &a;

old:SELECT &a
new:SELECT to_char(SYSDATE, 'yyyy')|| to_char(SYSDATE, 'mm') from dual

TO_CHA
------
201907

然后当你这样做

Select  'cost'a  from Table1;

您正在选择文本文字“成本”,并为该列表达式赋予别名a- 与您的变量完全无关;所以你会看到如下输出:

A   
----
cost
cost
cost
...

表中的每一行都有一个输出行。

代替您的定义,使用该column ... new_value ...选项使虚拟查询的结果可用作以后的替换变量:

column a new_value a;

select to_char(sysdate, 'YYYYMM') as a from dual;

A     
------
201907

select  cost&a  from table1;

old:select  cost&a  from table1
new:select  cost201907  from table1

COST201907
----------
        42
...

您可以将虚拟查询包装在一个set termout off... on对中,尽管您似乎仍然需要从文件运行脚本@以使其正常生效。set verify off一旦您对它感到满意,您就可以隐藏旧/新显示。


推荐阅读