2009-05-13 3 views
7

Вопрос:Oracle - имя динамического столбца в операторе select

Возможно ли иметь имя столбца в выражении выбора, измененное на основе значения в его результирующем наборе?

Например, если значение year в наборе результатов меньше 1950, имя столбца OldYear, в противном случае имя столбца NewYear. Значение year в результирующем наборе гарантировано будет одинаковым для всех записей.

Я думаю, что это невозможно, но здесь была моя неудачная попытка проверить эту идею:

select 1 as 
(case 
when 2 = 1 then "name1"; 
when 1 = 1 then "name2") 
from dual; 
+0

Зачем вам это нужно? Или вам просто интересно? – tuinstoel

+0

У меня была ситуация, когда это могло быть применимо, и мы придумали гораздо лучшее решение нашей проблемы. Я сделал это сообщение из любопытства. – Americus

ответ

4

Вы не можете изменять имя столбца для каждой строки результирующего набора. Это базовая база реляционных баз данных. Имена столбцов являются частью таблицы «header», а имя применяется к столбцу под ним для всех строк.


Re: ОК, возможно, OP Americus означает, что результат известен как ровно одна строка. Но независимо, SQL не имеет синтаксиса для поддержки динамического псевдонима столбца. Алиасы столбцов должны быть постоянными в запросе.

Даже динамический SQL не помогает, поскольку вам придется дважды запускать запрос. Однажды, чтобы получить значение, и второй раз, чтобы повторно запустить запрос с другим псевдонимом столбца.

+0

Я думаю, что Americus предполагает, что возвращается только одна строка и имеет изменение имени заголовка на основе набора результатов. – northpole

+0

Это в значительной степени то, что я ожидал. Благодаря! – Americus

1

Вам нужно будет что-то похожее на это:

select 'select ' || CASE WHEN YEAR<1950 THEN 'OLDYEAR' ELSE 'NEWYEAR' END || ' FROM TABLE 1' from TABLE_WITH_DATA 
1

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

Я предполагаю, что вы действительно являетесь способом форматирования вывода (например, для печати в отчете) по-разному в зависимости от данных. В этом случае я бы генерировать текст заголовка в виде отдельного столбца в запросе, например .:

SELECT 1 AS mydata 
     ,case 
      when 2 = 1 then 'name1' 
      when 1 = 1 then 'name2' 
     end AS myheader 
FROM dual; 

Тогда процедура вызова будет принимать значения возвращаемой для MyData и MYHEADER и форматировать их для вывода по мере необходимости.

2

«Правильный» способ сделать это в SQL, чтобы иметь оба столбца, и есть столбец, который является несоответствующим быть NULL, такие как:

SELECT 
    CASE WHEN year < 1950 THEN year ELSE NULL END AS OldYear, 
    CASE WHEN year >= 1950 THEN year ELSE NULL END AS NewYear 
FROM some_table_with_years; 
Смежные вопросы