Преобразовать строку из таблицы для использования в качестве столбца для выбора другой таблицы - PullRequest
0 голосов
/ 29 апреля 2020

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

TBL_1 

COL_1
==========
SAMPLE_COL
TBL_2

SAMPLE_COL_1  SAMPLE_COL2
============  ===========
ABC           DEF

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

Это пример запроса что я пробовал:

SELECT (SELECT column_1 FROM tbl_1)
FROM tbl_2

Ожидаемый вывод

SAMPLE_COL_1
============
ABC

Фактический вывод

(SELECT column_1 FROM tbl_1)
============================
SAMPLE_COL_1

Это то, что я пробовал, это работало до сих пор, но грубо Техника силы

SELECT (
  CASE
    WHEN (SELECT column_1 FROM tbl_2) = 'SAMPLE_COL_1' THEN SAMPLE_COL_1
    ELSE SAMPLE_COL_2
  END
)
FROM tbl_2

Цените помощь! Береги всех от COVID-19:)

1 Ответ

0 голосов
/ 29 апреля 2020

Это не так просто, как хотелось бы - вам придется использовать dynamici c SQL. Вот пример, основанный на таблицах Скотта.

Создайте функцию, которая принимает имена таблиц и столбцов и возвращает курсор ref.

SQL> create or replace function f_test
  2    (par_table_name in varchar2, par_column_name in varchar2)
  3  return sys_refcursor
  4  is
  5    rc sys_refcursor;
  6  begin
  7    open rc for 'select ' || dbms_assert.simple_sql_name(par_column_name) ||
  8                ' from '  || dbms_assert.sql_object_name(par_table_name);
  9    return rc;
 10  end;
 11  /

Function created.

Тестирование:

SQL> select f_test('dept', 'dname') from dual;

F_TEST('DEPT','DNAME
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

DNAME
--------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS


SQL> select f_test('dual', 'dummy') from dual;

F_TEST('DUAL','DUMMY
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

D
-
X


SQL>

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

Таблица, содержащая эту информацию и функцию:

SQL> select * from tbl_1;

TNAM CNAME
---- -----
dept dname
dual dummy

SQL> create or replace function f_test
  2    (par_table_name in varchar2)
  3  return sys_refcursor
  4  is
  5    l_str varchar2(1000);
  6    rc sys_refcursor;
  7  begin
  8    select 'select ' || dbms_assert.simple_sql_name(cname) ||
  9           ' from '  || dbms_assert.sql_object_name(tname)
 10      into l_str
 11      from tbl_1
 12      where tname = dbms_assert.sql_object_name(par_table_name);
 13    open rc for l_str;
 14    return rc;
 15  end;
 16  /

Function created.

Тестирование:

SQL> select f_test('dept') from dual;

F_TEST('DEPT')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

DNAME
--------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS


SQL>
...