Query using a statement within a VARCHAR2 column

有些话、适合烂在心里 提交于 2021-02-19 05:55:26

问题


Is there a way for a select statement to include in the WHERE clause a statement that is contained within the table? For example, the following table:

CREATE TABLE test_tab(
    date_column DATE,
    frequency NUMBER,
    test_statement VARCHAR2(255)
)
/

If

MOD(SYSDATE - DATE, frequency) = 0

were contained within the column test_statement, is there a way to select rows where this is true? The test_statement will vary and not be the same throughout the table. I am able to do this in PL/SQL but looking to do this without the use of PL/SQL.


回答1:


This kind of dynamic SQL in SQL can created with DBMS_XMLGEN.getXML. Although the query looks a bit odd so you might want to consider a different design.

First, I created a sample table and row using your DDL. I'm not sure exactly what you're trying to do with the conditions, so I simplified them into two rows with simpler conditions. The first row matches the first condition, and neither row matches the second condition.

--Create sample table and row that matches the condition.
CREATE TABLE test_tab(
    date_column DATE,
    frequency NUMBER,
    test_statement VARCHAR2(255)
)
/

insert into test_tab values(sysdate, 1, 'frequency = 1');
insert into test_tab values(sysdate, 2, '1=2');
commit;

Here's the large query, and it only returns the first row, which only matches the first condition.

--Find rows where ROWID is in a list of ROWIDs that match the condition.
select *
from test_tab
where rowid in
(
    --Convert XMLType to relational data.
    select the_rowid
    from
    (
        --Convert CLOB to XMLType.
        select xmltype(xml_results) xml_results
        from
        (
            --Create a single XML file with the ROWIDs that match the condition.
            select dbms_xmlgen.getxml('
                select rowid
                from test_tab where '||test_statement) xml_results
            from test_tab
        )
        where xml_results is not null
    )
    cross join
    xmltable
    (
        '/ROWSET/ROW'
        passing xml_results
        columns
            the_rowid varchar2(128) path 'ROWID'
    )
);



回答2:


This calls for dynamic SQL, so - yes, it is PL/SQL that handles it. I don't think that SQL layer is capable of doing it.

I don't know what you tried so far, so - just an idea: a function that returns ref cursor might help, e.g.

SQL> create table test (date_column date, frequency number, test_statement varchar2(255));

Table created.

SQL> insert into test values (trunc(sysdate), 2, 'deptno = 30');

1 row created.

SQL> create or replace function f_test return sys_refcursor
  2  is
  3    l_str varchar2(200);
  4    l_rc  sys_refcursor;
  5  begin
  6    select test_statement
  7      into l_str
  8      from test
  9      where date_column = trunc(sysdate);
 10
 11    open l_rc for 'select deptno, ename from emp where ' || l_str;
 12    return l_rc;
 13  end;
 14  /

Function created.

Testing:

SQL> select f_test from dual;

F_TEST
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO ENAME
---------- ----------
        30 ALLEN
        30 WARD
        30 MARTIN
        30 BLAKE
        30 TURNER
        30 JAMES

6 rows selected.


SQL>

A good thing about it is that you could save the whole statements into that table and run any of them using the same function.




回答3:


You can try this select * from test_tab where mod(sysdate - date, frequency) = 0;



来源:https://stackoverflow.com/questions/57174679/query-using-a-statement-within-a-varchar2-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!