通过连接文本选择列作为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中的列名的主要内容,如果未能解决你的问题,请参考以下文章