2016-03-25 4 views
1

В Oracle SQL Developer возможно ли псевдоним нескольких имен столбцов как часть оператора SELECT с использованием выражения (в отличие от ручного указания псевдонимов для каждого столбца)?Слияние нескольких столбцов с использованием выражения в Oracle SQL Developer

В частности, у меня есть таблица сопоставлений, которая хранит соответствующее подмножество столбцов из большой таблицы данных. Каждая запись в таблице сопоставлений связывает имя столбца таблицы данных с понятным для человека описанием. Я хочу выбрать столбцы таблицы данных, перечисленные в таблице сопоставления, и отобразить их с описаниями таблицы сопоставлений в качестве заголовков столбцов, но БЕЗ ручной ввода имен столбцов и их псевдонимов, читаемых человеком, один за другим. Это возможно?

Ближайший я нашел на ответ в Интернете это так вопрос, который предполагает, что я хочу сделать, это НЕ возможно: Oracle rename columns from select automatically?

Но этот вопрос с 2010 года я надеюсь, что ситуация изменилась , Спасибо за помощь.

ответ

0

Этого еще не может быть сделано со 100% родным SQL. Обычно эти чрезмерно динамические ситуации лучше всего избегать; немного дополнительной типизации, как правило, лучше, чем добавление сложного кода.

Если у вас действительно есть исключительный случай и готовы заплатить цену is способ сделать это. Он не использует 100% естественный SQL, но его можно считать «чистым» SQL, так как он использует структуру Data Data Cartridge для расширения базы данных.

Вы можете использовать мой проект с открытым исходным кодом Method4 для запуска динамического SQL в SQL. Следуйте инструкциям Github, чтобы загрузить и установить объекты. Код мучительно сложный, но, к счастью, вам не нужно будет разбираться в большей части этого. Для начала настройки имен столбцов необходимы только простые изменения.

Method4 Изменения

Создать переменную для хранения имя нового столбца. Добавьте его в раздел объявления функции ODCITableDescribe, в строке 12 файла METHOD4_OT.TPB.

v_new_column_name varchar2(32); 

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

 --Get mapped column name if it exists. If none, use the existing name. 
    select nvl(max(target_column_name), r_sql.description(i).col_name) 
    into v_new_column_name 
    from column_names 
    where source_column_name = r_sql.description(i).col_name; 

Изменение линии 42 для обозначения нового имени переменной:

     substr(v_new_column_name, 1, 30), 

Mapping Таблица

drop table column_names; 
create table column_names 
(
    source_column_name varchar2(30), 
    target_column_name varchar2(30), 
    constraint column_names_pk primary key(source_column_name) 
); 
insert into column_names values('A1234', 'BETTER_COLUMN_NAME'); 
insert into column_names values('B4321', 'Case sensitive column name.'); 

Запрос Пример

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

SQL> select * from table(method4.query('select 1 a1234, 2 b4321, 3 c from dual')); 

BETTER_COLUMN_NAME Case sensitive column name.   C 
------------------ --------------------------- ---------- 
       1       2   3 

Предупреждения

Oracle SQL чудовищно сложный и любая попытка построить слой на вершине, если он имеет много потенциальных проблем. Например, производительность, безусловно, будет медленнее. Хотя я создал много модульных тестов, я уверен, что есть некоторые странные типы данных, которые не будут работать корректно. (Но если вы их найдете, создайте вопрос Github, чтобы я мог исправить его.)

По моему опыту, когда люди просят такого типа динамического поведения, это обычно не стоит затрат. Иногда небольшая дополнительная набраковка - лучшее решение.

+0

Спасибо Jon! Я благодарен вам за то, что уделил время времени, чтобы ответить и даст этот шанс. Причина, по которой я ищу динамическое решение, заключается в том, что каждый раз, когда мне нужно запускать этот запрос, и это часто - это против новых таблиц с новыми именами столбцов. –

Смежные вопросы