将 table 中的字符串转换为另一个 table 的选择列

Convert string from a table to be used as a column for selection for another table

我有一个 table 存储记录以用作我的查询的列名,其中记录是另一个 table.

上的实际列
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 :)

这并不像您希望的那样简单 - 您必须使用 动态 SQL。这是一个基于 Scott 的 table(s) 的示例。

创建一个接受 table 和列名以及 returns 引用游标的函数。

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>

另一个示例,列(和 table)名称存储在 table(类似于您发布的内容)中。

Table 包含这些信息和函数:

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>