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
我正在为一个 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