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

vdgimpew  于 2023-04-05  发布在  Oracle
关注(0)|答案(1)|浏览(142)

我正在努力在一个表中命名列,使用包含这些名称的引用表。我相信这应该是可能的,但我似乎无法找到正确的解决方案或想到正确的逻辑来实现它...
情况:我有两个表,一个表中有数据,列有描述性的名称,另一个表中有将这些列名转换为有意义的名称(引用表或“代码本”)。
我正在寻找一种方法来返回第一个表的数据,并在第二个表的第二列中给出列名。
表看起来像:

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

帮助将不胜感激!

nhaq1z21

nhaq1z211#

你不能直接这样做,因为你需要一个查询,其列是可变的,基于一些值。略有不同,你可以做的是构建一个动态SQL,让Oracle创建你的查询:
设置:

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

相关问题