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

Oracle PL/SQL set column names using other table

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

情况:我有 2 个 table,一个包含数据,列具有描述性名称,另一个包含将这些列名称翻译成有意义的名称(参考 table,或 'codebook').

我正在寻找一种方法来 return 第一个 table 的数据,其中列的名称在第二个 table 的第二列中给出。

表格看起来像:

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

非常感谢您的帮助!

您不能直接这样做,因为您需要一个基于某些值的列可变的查询。 略有不同,您可以做的是构建一个动态的 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>

这样你就有了你的查询,但是你不能获取它,因为它仍然有可变的列。

您可以轻松地编辑此代码,使其构建一个 returns 字符串的查询,通过连接字段组成;这样你将永远只有一个字段,但它与你所要求的不同:

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