将 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>
我有一个 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>