首页 > 解决方案 > Oracle SQL - 使用一个表中的列名作为另一个表中的查询参数

问题描述

请需要帮助!这是问题所在:

事务表(A):

TXID, NAME, DESCRIPTION, GROUP, DATE, TYPE, AMOUNT, etc. 

(例如12345, 'SAMPLE TRANSACTION','test','TXGROUP1','FEB.15 2019',500.00, etc.

查找/控制表 (B):

COLID, COLNAME, FLAG

(例如1,'NAME', 0; 2,'DATE',1, etc.

问题是,我需要编写一个查询来获取表 B 中的所有 COLNAME 值,并从表 A 中选择它们对应的分组值。例如:

我试过的:

我可能会期待这样的事情:

NAME, COL(例如'SAMPLE TRANSACTION', 'FEB.15 2019'

标签: sqloracle

解决方案


可以在 SQL运行动态 SQL,但解决方案很痛苦。最简单的方法是使用包DBMS_XMLGEN并且不需要任何额外的 PL/SQL 对象。

下面的示例有效,但非常简单。真实版本必须处理许多类型转换问题,检索其他值等。

--Read a value based on the CONTROL table.
select
    to_number(extractvalue(xml, '/ROWSET/ROW/COL')) COL
from
(
    select xmltype(dbms_xmlgen.getxml(v_sql)) xml
    from
    (
        select 'select '||colname||' col from transaction' v_sql
        from control
    )
);

COL
---
  2

结果基于此示例架构:

--Sample schema:
create table control
(
    COLID number,
    COLNAME varchar2(4000),
    FLAG number
);
insert into control values(1,'NAME',1);

create table transaction
(
    TXID number,
    NAME varchar2(100),
    DESCRIPTION varchar2(4000),
    the_GROUP varchar2(100),
    the_DATE date,
    TYPE varchar2(100),
    AMOUNT number
);
insert into transaction values(1,2,3,4,sysdate,6,7);
commit;

如果您有更复杂的查询需求,例如如果您需要返回未知数量的列,则需要安装类似我的开源程序Method4 之类的东西。该程序允许在 SQL 中使用动态 SQL,但它需要先安装一些新对象。

在实践中,很少需要这种级别的动态 SQL。通常最好找到一种更简单的方法来解决问题。


推荐阅读