通过连接文本选择列作为oracle中的列名

Posted

技术标签:

【中文标题】通过连接文本选择列作为oracle中的列名【英文标题】:select columns by a concat text as columnname in oracle 【发布时间】:2010-06-02 20:58:09 【问题描述】:

我有一个表,其中的列以一天中的小时数命名,如下所示:

col00 NUMBER(5)
col01 NUMBER(5)
col02 NUMBER(5)
...
col23 NUMBER(5)

...我还有另一个按小时返回计数的查询。

我想按小时恢复 colXX 值....然后我可以使用“decode”或“case when...”来恢复,但我想知道是否存在通过如下文本恢复列的任何方法:

select "col"||hour from table;

在上面的假设示例中,如果小时为 13,那么将被翻译为:

select col13 from table;

有什么办法吗?

【问题讨论】:

【参考方案1】:

你必须使用动态 SQL:

EXECUTE IMMEDIATE 'SELECT col'|| hour || ' FROM TABLE;'

参考:

EXECUTE IMMEDIATE option for Dynamic SQL and PL/SQL

【讨论】:

我知道立即执行,但我需要在子查询中使用它。不是 PL 块。 @glaudiston:你不能——要么整个查询都是动态 SQL,要么你创建一个函数(或存储过程)来根据这个动态 SQL 返回值。【参考方案2】:

关闭...

select REGEXP_REPLACE(
 REGEXP_REPLACE( DBMS_XMLGEN.GETXML('
 SELECT col'|| to_char(sysdate,'HH24') || ' FROM TABLE
'),'.*<[/]?(\?xml .*>|ROW).*',''),'  (<([^>]*)>([^<]*)</[^>]*>.*)','\2=\3') AS RES  from dual

它不是那么简单,但非常灵活,对我来说非常有用。

【讨论】:

【参考方案3】:

虽然看起来有点...蛮力...您可以在查询之间使用一堆 UNION 语句:

SELECT col00
  FROM TABLE 
 WHERE to_char(SYSDATE, 'HH24') = '00'
UNION
SELECT col01
  FROM TABLE 
 WHERE to_char(SYSDATE, 'HH24') = '01'
UNION
SELECT col02
  FROM TABLE 
 WHERE to_char(SYSDATE, 'HH24') = '02'  
   (...and so on...)
UNION
SELECT col23
  FROM TABLE 
 WHERE to_char(SYSDATE, 'HH24') = '23' 

【讨论】:

这不是我要找的……但无论如何。 感谢您的回复,但我发现使用 dbms_xml.getxml('query') 更灵活。这样我就可以生成查询并得到它的结果。 select dbms_xml.getxml('SELECT col'|| to_char(sysdate,'HH24') || ' FROM TABLE;') from dual;

以上是关于通过连接文本选择列作为oracle中的列名的主要内容,如果未能解决你的问题,请参考以下文章

oraclede中数据定义语言

从连接表列表中选择唯一的列名

如何通过 Spack JDBC 选择特定列?

oracle中,查询结果去除重复列,插入到新表中

如何通过SQL从IBM db2中的查询中获取列名

Informix JDBC PySpark 将列名中的结果作为列值读取