выбрать столбцы по конкретному тексту в качестве имени столбца в Oracle - PullRequest
1 голос
/ 03 июня 2010

У меня есть таблица со столбцами, названными с указанием номера часа дня:

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;

есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Вы должны использовать динамический SQL:

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

Справка:

1 голос
/ 06 сентября 2010

Закрытие ...

select REGEXP_REPLACE(
 REGEXP_REPLACE( DBMS_XMLGEN.GETXML('
 SELECT col'|| to_char(sysdate,'HH24') || ' FROM TABLE
'),'.*<[/]?(\?xml .*>|ROW).*',''),'  (<([^>]*)>([^<]*)</[^>]*>.*)','\2=\3') AS RES  from dual

это не так просто, но очень гибко и прекрасно работает для меня.

0 голосов
/ 08 июня 2010

Хотя это выглядит немного ... грубой силой ... вы можете использовать несколько операторов 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' 
...