2013-07-16 58 views
1

用戶給了我一張如下所示的表。Oracle SQL動態選擇列名

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會做到這一點,或者我需要重組用戶給我的表,這將偶爾發生。

在此先感謝。

+0

總是可以做一個大的case語句 - 不particularily不錯,但它的工作 – Andrew

+3

你真的應該重新構造表,它的名字和時間都是獨一無二的,而不僅僅是名字。 – Ben

回答

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' 
+0

這工作完美!很簡單。謝謝。 – Joe

+0

@Joe:很高興我能幫上忙。 –

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

嘗試了這一點

+1

這似乎是SQL Server語法,而不是Oracle。在Oracle中'DATEPART','getdate'和'convert'無效。即使您將語法轉換爲使用等效的Oracle結構,「SELECT」語句也不會動態更改它所提取的列名,它只會選擇恰好也是列名的字符串文字。 –

+0

不知何故錯過了甲骨文部分... – tkendrick20

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';