繁体   English   中英

将列名转换为列值

[英]Convert column name as Column Value

我有个问题。 有 2 个表(配置和数据)。
我想从配置表中获取 select 值并将其用作 data.table 中的列名。

即)通过从 x_config 中选择 id=1,我想得到 A,B,C

我可以使用 cursor 从 x_config 获取列名,并可以将该值传递给我的过程中的另一个查询,但我想知道是否有任何其他方法可以在单个查询中实现这一点。

create table ABC
(
name varchar2(20),
age number,
phone number
);

Insert into ABC Values('A',10,1111);
Insert into ABC Values('B',20,1122);
Insert into ABC Values('C',30,3333);

create table x_config
(
col varchar2(20),
id number
);

Insert into x_config Values('name',1);
Insert into x_config Values('age',2);
Insert into x_config Values('phone',3);


select col from x_config where id=1;

提前致谢!

另一种方法是使用动态SQL; 一种方法是利用 XML 技巧:

select xml.result
from x_config xc
cross apply xmltable('/ROWSET/ROW'
  passing dbms_xmlgen.getxmltype(
      'select ' || xc.col || ' as result from abc'
    )
  columns result
) xml
where xc.id = 1;
结果
一种
C

数据库<>小提琴

dbms_xmlgen调用使用查找表中的列名生成动态语句,并将结果作为 XML 文档获取。 然后将其用作提取值的 XMLTable 的源。

您可以一次获得多个值,但您需要知道有多少,因此columns子句匹配。 而且您无法获得结果集的原始列名; 我认为你需要一种不同形式的动态 SQL 和一个参考 cursor。

您可以使用CASE表达式:

SELECT CASE (SELECT col FROM x_config WHERE id = 1)
       WHEN 'name'
       THEN name
       WHEN 'age'
       THEN TO_CHAR(age)
       WHEN 'phone'
       THEN TO_CHAR(phone)
       END AS value
FROM   abc

其中,对于您的示例数据,输出:

价值
一种
C

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM