【问题标题】:select columns by a concat text as columnname in oracle通过连接文本选择列作为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;

有什么办法吗?

【问题讨论】:

    标签: sql oracle plsql dynamic-sql


    【解决方案1】:

    你必须使用动态 SQL:

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

    参考:

    【讨论】:

    • 我知道立即执行,但我需要在子查询中使用它。不是 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;
      猜你喜欢
      • 2020-03-12
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      相关资源
      最近更新 更多