in语句是否可能是动态的?像动态逗号分隔
例如:
DATA=1
select * from dual
where
account_id in (*DATA);
DATA=2
select * from dual
where
account_id in (*DATA1,*DATA2);
FOR DATA = n 对于未知数量,我将如何使in语句动态/灵活(逗号)。
select * from dual
where
account_id in (*DATAn,*DATAn+1,etc);
答案 0 :(得分:0)
分层查询可能会有所帮助。
acc
CTE代表示例数据level
个伪列的值连接在一起您在这里:
SQL> with acc (account_id) as
2 (select 'data1' from dual union all
3 select 'data2' from dual union all
4 select 'data3' from dual union all
5 select 'data4' from dual
6 )
7 select *
8 from acc
9 where account_id in (select 'data' || level
10 from dual
11 connect by level <= &n
12 );
Enter value for n: 1
ACCOU
-----
data1
SQL> /
Enter value for n: 3
ACCOU
-----
data1
data2
data3
SQL>
答案 1 :(得分:0)
正如我所看到的,您使用Where子句中的数字,Substitution
就足以解决您的问题。
请参见以下示例:
CREATE table t(col1 number);
insert into t values(1);
insert into t values(2);
insert into t values(3);
-- Substitution variable initialization
define data1=1;
define data2='1,2';
-
-- With data1
select * from t where col1 in (&data1);
输出:
-- With data2
select * from t where col1 in (&data2);
输出:
希望,这对您有帮助。
干杯!
答案 2 :(得分:0)
基本问题不是listagg函数,而是一个主要的误解,即仅仅因为字符串列表中的元素是逗号分隔的,所以其中包含逗号的字符串才是列表。不是这样考虑具有以下行的表。
密钥
-数据1
-Data2
-数据1,数据2
然后查询:从table_name中选择*,其中key ='wanted_key';现在,如果 all 用逗号分隔独立的元素,则需要“ wanted_Key”的值是什么才能仅返回上面的第三行?即使使用IN谓词'Data1,Data2'仍然只是1个值,而不是2个值。对于2个值,它必须是('Data1','Data2')。
Listagg遇到的问题不是因为逗号,而是因为它不是适当的功能。 Listagg从多个行中获取值,然后合并为一个逗号分隔的字符串,而不是逗号分隔的列表。示例:
with elements as
( select 'A' code, 'Data1' item from dual union all
select 'A', 'Data2' from dual union all
select 'A', 'Data3' from dual
)
select listagg( item, ',') within group (order by item)
from elements group by code;
(您可能还想将“ Data1,Data2”作为单个元素尝试。请当心。
您需要的是一个单独分解每个元素的查询。这可以通过
with element_list as
(select 'Data1,Data2,Data3' items from dual) -- get paraemter string
, parsed as
(select regexp_substr(items,'[^,]+',1,level) item
from element_list connect by regexp_substr(items,'[^,]+',1,level) is not null -- parse string to elements
)
CTE“已解析”现在可以用作查询中的表/视图。
这与直接使用参数进行查询相比,效果不佳,但是性能下降是动态/灵活查询的代价。
同样,按照设置,这将不会处理单个元素中包含逗号的参数。这将需要更多代码,因为您必须确定/设计如何将逗号保留在这些元素中。