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

时间:2010-06-02 20:58:10

标签: sql oracle plsql dynamic-sql

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

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

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

我希望按小时恢复colXX值....然后我可以使用“解码”或“情况......”恢复,但我想知道是否存在以任何方式通过如下文本恢复列:

select "col"||hour from table;

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

select col13 from table;

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

您必须使用动态SQL:

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

参考:

答案 1 :(得分:1)

...结算

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

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

答案 2 :(得分:0)

虽然它看起来有点......暴力......你可以在查询之间使用一堆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'