Как получить данные из таблицы базы данных Oracle, кроме определенных столбцов?

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

(это можно сделать как добавление имен столбцов для предложения select. Но предполагая, что в будущем будут добавлены новые столбцы, я хочу написать более общий код)

пример

Employee(id , name , age, gender)

select *
from table_name
where column_name not like a%

после запроса он должен отображать таблицу с

Employee(id , name . gender)  

столбца возраста нет, потому что мы не включены в результат


person Nipun Alahakoon    schedule 10.03.2016    source источник
comment
Примерные данные и ожидаемые результаты были бы полезны. not like 'a%' -- там отсутствуют одинарные кавычки... Или вы хотите динамически выбирать имена столбцов, если они похожи на a? Если да, то почему?   -  person sgeddes    schedule 10.03.2016
comment
Боюсь, это невозможно. Если вы не выберете все столбцы (*) из определенной таблицы, вам придется указать их явно.   -  person David Faber    schedule 10.03.2016
comment
Is it possible on oracle? Возможно ли это в других СУБД?   -  person Sindhoo Oad    schedule 10.03.2016
comment
Привет . Спасибо за комментарии. я хочу вертикально разрезать таблицу, чтобы исключить столбцы в условии. так, например, если я получил таблицу как Сотрудник (id, имя, возраст, пол). я хочу получить таблицу, исключая определенный столбец, указанный в критериях, и отображать остальную часть результата.   -  person Nipun Alahakoon    schedule 10.03.2016
comment
я отредактировал вопрос, как в примере .@sgeddes   -  person Nipun Alahakoon    schedule 10.03.2016
comment
Смотрите мой ответ, чтобы иметь программный способ сделать это... но это может быть не то, что вы ищете.   -  person J. Chomel    schedule 30.03.2016


Ответы (2)


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

declare
    vSQL  varchar2(32767);
    vClob clob;
begin
    /* build the query */
    select distinct 'select ' || listagg(column_name, ',') within group (order by column_name) over (partition by table_name)|| ' from ' || table_name
    into vSQL
    from user_tab_columns
    where table_name = 'EMPLOYEE'
      and column_name not like 'A%';

    /* print the query */
    dbms_output.put_line(vSQL);

    /* build an XML */
    select DBMS_XMLGEN.getXML(vSQL)
    into vClob
    from dual;   
    dbms_output.put_line(vClob);

    /* build a CLOB with all the columns */
    vSQL := replace (vSQL, ',', ' || '' | '' || ' );
    execute immediate vSQL into vClob;    
    dbms_output.put_line(vClob);
end; 

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

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

person Aleksej    schedule 10.03.2016

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

declare
   your_table varchar2(40) := 'CHEMIN';
   select_to_tmp varchar2(4000) := 'create table ttmp as select ';
begin
    -- drop temporary table if exists
    begin
       execute immediate 'drop table ttmp';
  Exception 
   When others Then 
        dbms_output.put_line(SQLERRM);
    end;

    for x in (
      select column_name from all_tab_columns 
      where table_name=your_table
       and column_name not in (
       -- list columns you want to exclude
       'COL_A'
     , 'COL_B'
     )
   )
   loop
       select_to_tmp := select_to_tmp|| x.column_name ||',';
       dbms_output.put_line(x.column_name);
   end loop;
   -- remove last ','
   select_to_tmp := substr(select_to_tmp, 1, length(select_to_tmp) -1);
   -- from your table
   select_to_tmp := select_to_tmp||' from '||your_table;
   -- add conditions if necessary
   -- select_to_tmp := select_to_tmp|| ' where rownum < 1 '
   dbms_output.put_line(select_to_tmp);
   -- then create the temporary table using the query you generated:
   execute immediate select_to_tmp;
end;
/ 


SELECT * FROM ttmp;
person J. Chomel    schedule 10.03.2016