Если первое поле не существует в таблице, посмотрите на другое поле в той же таблице - PullRequest
0 голосов
/ 07 июня 2018

Есть ли способ выбрать поле из таблицы и, если это поле не существует, выбрать другое поле из той же таблицы?пример:

SELECT MY_FIELD from MY_TABLE

ошибка: "MY_FIELD": неверный идентификатор

есть ли способ проверить, существует ли он, и если он существует, то использовать это поле длязапрос, если он не существует, используйте пример:

SELECT my_field2 from client.

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

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

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

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

create table test ( present_column NUMBER );

insert into test select rownum * 10 from dual connect by rownum <= 5;


    declare
      l_rc SYS_REFCURSOR;
    begin
      BEGIN
        OPEN l_rc FOR 'SELECT missing_column FROM test';
      EXCEPTION
        WHEN others THEN
          OPEN l_rc FOR 'SELECT present_column FROM test';
      END;
      -- This next only works in 12c and later
      -- In earlier versions, you've got to process l_rc on your own.
      DBMS_SQL.RETURN_RESULT(l_rc);
    end;

Это уступает другим решениям (либо гармонизация баз данных, либо создание представлений).Во-первых, вы не получаете проверку ваших запросов во время компиляции таким образом.

0 голосов
/ 07 июня 2018

Это можно сделать в одном операторе SQL, используя DBMS_XMLGEN.GETXML, но это может привести к путанице.Возможно, было бы лучше использовать динамический SQL или представление, но бывают ситуации, когда сложно создавать вспомогательные объекты.

Пример таблицы:

--Create either table.
create table my_table(my_field1 number);
insert into my_table values(1);
insert into my_table values(2);

create table my_table(my_field2 number);
insert into my_table values(1);
insert into my_table values(2);

Запрос:

--Get the results by converting XML into rows.
select my_field
from
(
    --Convert to an XMLType.
    select xmltype(clob_results) xml_results
    from
    (
        --Conditionally select either MY_FIELD1 or MY_FIELD2, depending on which exists.
        select dbms_xmlgen.GetXML('select my_field1 my_field from my_table') clob_results
        from user_tab_columns
        where table_name = 'MY_TABLE'
            and column_name = 'MY_FIELD1'
            --Stop transformations from running the XMLType conversion on nulls.
            and rownum >= 1
        union all
        select dbms_xmlgen.GetXML('select my_field2 my_field from my_table') clob_results
        from user_tab_columns
        where table_name = 'MY_TABLE'
            and column_name = 'MY_FIELD2'
            --Stop transformations from running the XMLType conversion on nulls.
            and rownum >= 1
    )
    --Only convert non-null values.
    where clob_results is not null
)
cross join
xmltable
(
    '/ROWSET/ROW'
    passing xml_results
    columns
        my_field number path 'MY_FIELD'
);

Результаты:

MY_FIELD
--------
1
2

Вот скрипта SQL, если вы хотите, чтобы он работал.

0 голосов
/ 07 июня 2018

Это не скомпилируется, поэтому - я бы сказал, нет.Вы можете попробовать динамический SQL, который читает содержимое USER_TAB_COLUMNS и создает оператор SELECT на лету.

В зависимости от используемого вами инструмента отчетности это может (или не может) быть возможным.Например, Apex предлагает (в качестве источника отчетов) функцию, которая возвращает запрос, поэтому вы можете использовать ее там.

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

-- database 1:
create view v_client as
  select client_id id,
         client_name name
  from your_table;

-- database 2:
create view v_client as
  select clid id,
         clnam name
  from your_table;

-- reporting tool:
select id, name
from v_client;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...