Oracle SQL动态选择列名

时间:2013-07-16 15:21:27

标签: sql oracle select

用户给了我一张如下所示的表格。

Name   HH08   HH09   HH10   HH11   HH12   HH13
Bob      2      3      4      2      7      1
Steve    2      9      3      2      2      5
Mike     2      2      2      2      3      2
Pat      1      0      2      0      0      0

我需要一些基于名称选择行的sql,以及基于运行查询时sysdate当前小时的列。

如果是上午9:27并且用户是Steve,则sql需要选择9值。

是否有任何简单的sql可以执行此操作,或者我是否需要重构用户提供给我的表,这将是偶尔的。

提前致谢。

3 个答案:

答案 0 :(得分:4)

尝试:

select case to_char(sysdate,'hh24')
           when '08' then hh08
           when '09' then hh09
           when '10' then hh10
           when '11' then hh11
           when '12' then hh12
           when '13' then hh13
       end OutputValue
from TableName
WHERE Name = 'Steve'

答案 1 :(得分:1)

SELECT 'HH'+convert(char(2),DATEPART(hour,getdate()))
FROM TableName
WHERE Name = 'Steve'

试试这个

答案 2 :(得分:1)

with t as (
  select 'Bob' name, 2 hh08, 3 hh09, 4 hh10, 2 hh11, 7 hh12, 1 hh13 from dual union all
  select 'Steve',    2,      9,      3,      2,      2,      5 from dual union all
  select 'Mike',     2,      2,      2,      2,      3,      2 from dual union all
  select 'Pat',      1,      0,      2,      0,      0,      0 from dual 
)
--/\-- Data sample --/\--
select value from t
  unpivot(value for hr in (hh08 as '08', hh09 as '09', hh10 as '10', hh11 as '11', hh12 as '12', hh13 as '13') )
 where hr = to_char(sysdate, 'HH24')
   and name = 'Pat';