如何在PL/SQL中的where条件下,在新查询中使用IN子句使用INTO创建的动态变量
我从中得到l_过滤器为'016','018','011','014'。现在我想在下面的查询中动态地使用IN子句中的这个l_过滤器值 从网格中选择a、b 其中,l_过滤器中的过滤器_值; 如何在PL/SQL中执行此操作?您可以使用正则表达式:如何在PL/SQL中的where条件下,在新查询中使用IN子句使用INTO创建的动态变量,sql,oracle,plsql,Sql,Oracle,Plsql,我从中得到l_过滤器为'016','018','011','014'。现在我想在下面的查询中动态地使用IN子句中的这个l_过滤器值 从网格中选择a、b 其中,l_过滤器中的过滤器_值; 如何在PL/SQL中执行此操作?您可以使用正则表达式: DECLARE l_filter varchar2(100); BEGIN SELECT filter INTO l_filter FROM dashboard WHERE id=TARGET_ID_1; 这不是特别有效,但它不需要任何
DECLARE
l_filter varchar2(100);
BEGIN
SELECT filter INTO l_filter
FROM dashboard
WHERE id=TARGET_ID_1;
这不是特别有效,但它不需要任何PL/SQL或动态SQL
也就是说,您可能希望将筛选器存储为表中的行,这样您就可以将所有内容连接在一起,而不必复杂化。使用LIKE:
声明
l_过滤器varchar2100;
当前系统参考光标;
网格。a%类型;
b网格。b%类型;
开始
选择过滤器
进入l_过滤器
从仪表板
式中,id=目标_id_1;
开放
选择a、b
来自网格
式中“,”|| SUBSTRl|u filter,2,LENGTHl|u filter-2 | |“,”与“%”类似,“| filter|u value |,%”;
环
把cur带进a,b;
未找到cur%时退出;
DBMS_OUTPUT.PUT_LINEa | |','| | b;
端环;
封闭电流;
终止
/
dbfiddle以下是我如何理解这个问题的 首先是样本数据:
select g.a, g.b
from grid g
where exists (select 1
from dashboard d.
where d.id = TARGET_ID_1 and
regexp_like(d.filter_value, '^(' || replace(d.filter, '''', ''), ',', '|') || ')$')
);
返回refcursor的函数;本例中的关键是将筛选值拆分为行,以便将其用作子查询行15-18:
SQL> select * from dashboard;
ID FILTER
---------- -----------------------
1 '016','018','011','014'
2 '111', '222'
SQL> select * from grid;
A B FIL
---------- ---------- ---
100 200 016
101 201 011
200 400 xxx
SQL>
谢谢你,戈登。这是一个固定的输出->l_过滤器为'016','018','011','014'。如何将其转换为行格式?有什么建议吗?过滤器总是varchar2的列表吗?在这种情况下,最好将过滤器存储为一个嵌套表或varchar的varray
SQL> create or replace function f_get (target_id_1 in dashboard.id%type)
2 return sys_refcursor
3 is
4 l_filter varchar2(100);
5 rc sys_refcursor;
6 begin
7 select filter
8 into l_filter
9 from dashboard
10 where id = target_id_1;
11
12 open rc for
13 select g.a, g.b
14 from grid g
15 where g.filter_value in (select regexp_substr(replace(l_filter, chr(39), ''), '[^,]+', 1, level)
16 from dual
17 connect by level <= regexp_count(l_filter, ',') + 1
18 );
19
20 return rc;
21 end;
22 /
Function created.
SQL> select f_get(1) from dual;
F_GET(1)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
A B
---------- ----------
100 200
101 201
SQL>