Oracle PL / SQL使用其他表设置列名

时间:2016-05-23 15:02:13

标签: oracle plsql columnname

我正在努力在一个表中命名列,使用包含这些名称的引用表。我确信它应该是可能的,但我似乎无法找到正确的解决方案或想出实现它的正确逻辑......

情况:我有2个表,一个包含数据,一个列具有描述性名称,另一个包含这些列名称到有意义名称的转换(参考表或#39;代码簿')。

我正在寻找一种方法来返回第一个表的数据,并在第二个表的第二列中给出列的名称。

表格如下:

dataTable:
q1,q2,q3
1,2,3
4,5,6

translationTable:
descName, meanName
q1, meaning1
q2, meaning2
q3, meaning3

结果应该是:

meaning1,meaning2,meaning3
1,2,3
4,5,6

帮助将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

您无法直接执行此操作,因为您需要基于某个值的列可变的查询。 稍有不同,您可以做的是构建一个动态SQL以使您的查询由Oracle创建:

SETUP:

SQL> create table dataTable(q1,q2,q3) as
  2  select 1,2,3 from dual union all
  3  select 4,5,6 from dual
  4  ;

Table created.

SQL> create table translationTable(descName, meanName) as
  2  select 'q1', 'meaning1' from dual union all
  3  select 'q2', 'meaning2' from dual union all
  4  select 'q3', 'meaning3' from dual ;

Table created.

这将创建并打印您的查询:

SQL> declare
  2      vSQL varchar2(1000);
  3  begin
  4      select listagg (column_name || ' AS "' || meanName || '"', ', ') within group (order by column_name)
  5      into vSQL
  6      from user_tab_columns col
  7        inner join translationTable    tr
  8          on (upper(tr.descName) = col.column_name)
  9      where table_name = upper('dataTable');
 10      --
 11      vSQL := 'select ' || vSQL || ' from dataTable';
 12      dbms_output.put_line(vSQL);
 13  end;
 14  /
select Q1 AS "meaning1", Q2 AS "meaning2", Q3 AS "meaning3" from dataTable

PL/SQL procedure successfully completed.

如果您复制语句并运行它:

SQL> select Q1 AS "meaning1", Q2 AS "meaning2", Q3 AS "meaning3" from dataTable;

  meaning1   meaning2   meaning3
---------- ---------- ----------
         1          2          3
         4          5          6

SQL>

通过这种方式,您可以查询,但无法获取查询,因为它仍然具有可变列。

您可以轻松编辑此代码,使其构建一个返回字符串的查询,通过连接这些字符串组成;通过这种方式,您将始终拥有一个字段,但它与您提出的要求不同:

SQL> select 'meaning1, meaning2, meaning3' from dual
  2  union all
  3  select Q1 || ',' || Q2 || ',' ||  Q3 from dataTable;

'MEANING1,MEANING2,MEANING3'
--------------------------------------------------------------------------------
meaning1, meaning2, meaning3
1,2,3
4,5,6