2013-07-16 6 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 утра, а пользователь - Стив, sql необходимо выбрать значение 9.

Есть ли какой-нибудь простой sql, который сделает это, или мне нужно перестроить таблицу, которую пользователь дает мне, что будет происходить случайно.

Заранее спасибо.

+0

всегда могли бы сделать это в большом сазе - не particularily хорошо, но это будет работать – Andrew

+3

Вы должны действительно заново структурировать таблицу, иметь уникальное имя и час, а не только имя. – Ben

ответ

4

Try:

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. 'DATEPART',' getdate' и 'convert' недействительны в Oracle. И даже если вы преобразуете синтаксис для использования эквивалентных конструкций Oracle, оператор SELECT не будет динамически изменять имя столбца, которое он извлекает, он просто выберет строковый литерал, который также стал именем столбца. –

+0

Как-то пропустил эту часть Oracle ... – 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'; 
Смежные вопросы