【问题标题】:Can I use a query by itself as a filter in pl/sql?我可以将查询本身用作 pl/sql 中的过滤器吗?
【发布时间】:2021-01-05 01:53:57
【问题描述】:

我知道我没有在问题标题中说清楚。让我解释一下。

假设我有一个表 SOURCE_TABLE,其中 1 列如下所示:

Filter 
------------------|
Name='John' 
Surname = 'Smith' 
Age = '25'

我想用这个表作为过滤器。如下:

SELECT * FROM TARGET_TABLE WHERE (SELECT FILTER FROM SOURCE_TABLE)

我听说评估功能可能对我有帮助,但老实说我不明白如何。

你知道有什么方法可以像上面那样使用列作为我的过滤器源吗?


编辑1:

DECLARE 
    my_filter VARCHAR2(100); 
    my_query VARCHAR2(500); 
BEGIN 
    my_query := 'SELECT FILTER FROM SOURCE_TABLE WHERE ROWNUM=1'; 
    EXECUTE IMMEDIATE my_query INTO my_filter; 
    EXECUTE IMMEDIATE 'SELECT * FROM TARGET_TABLE WHERE '|| my_filter; 
END; 

@Sujitmohanty30我在学习EXECUTE IMMEDIATE后想出了上面的。但是我偶然发现了一个问题。对于最终结果,这需要是动态的,我想在最后看到选择查询的结果。

【问题讨论】:

  • 这种类型的需求需要动态构建SQL,你可以在oracle中使用execute immediate实现同样的效果。你还好吗?
  • 还有xmltable/xmlquery解决方案。我回家后会发布它
  • 请不要在 cmets 中添加代码。 edit 改为您的问题

标签: sql oracle plsql dynamic-sql


【解决方案1】:

假设我们有这两张表:

create table TARGET_TABLE(name varchar2(30), surname varchar2(30));
insert into TARGET_TABLE(name,surname) values ('John', 'Doe');
insert into TARGET_TABLE(name,surname) values ('Ann', 'Smith');
insert into TARGET_TABLE(name,surname) values ('Steven', 'Feuerstein');
insert into TARGET_TABLE(name,surname) values ('Steven', 'King');
commit;

create table SOURCE_TABLE(filter) as
select q'[name='John']' from dual union all
select q'[name='Ann']' from dual union all
select q'[name='Steven' and surname='King']' from dual union all
select q'[surname='Feuerstein']' from dual;

然后你可以使用 xmltable 和 dbms_xmlgen.getXMLtype 来动态获取这样的行:

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=72abdf18b149cf30882cb4e1736c9c33

select *
from SOURCE_TABLE
    , xmltable(
        '/ROWSET/ROW'
        passing dbms_xmlgen.getXMLtype('select * from TARGET_TABLE where '|| SOURCE_TABLE.filter)
        columns 
          name    varchar2(30) path 'NAME',
          surname varchar2(30) path 'SURNAME'
        ) x;

结果:

FILTER                           NAME                           SURNAME
-------------------------------- ------------------------------ ------------------------------
name='John'                      John                           Doe
name='Ann'                       Ann                            Smith
name='Steven' and surname='King' Steven                         King
surname='Feuerstein'             Steven                         Feuerstein

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2020-02-27
  • 2019-08-05
相关资源
最近更新 更多