动态(SQL)输入值

时间:2019-06-19 04:09:40

标签: sql oracle plsql

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);

3 个答案:

答案 0 :(得分:0)

分层查询可能会有所帮助。

  • acc CTE代表示例数据
  • 第9-11行是您所需要的;数据与分层查询返回的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);

输出:

enter image description here

-- With data2
select * from t where col1 in (&data2);

输出:

enter image description here

希望,这对您有帮助。

干杯!

答案 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“已解析”现在可以用作查询中的表/视图。
这与直接使用参数进行查询相比,效果不佳,但是性能下降是动态/灵活查询的代价。
同样,按照设置,这将不会处理单个元素中包含逗号的参数。这将需要更多代码,因为您必须确定/设计如何将逗号保留在这些元素中。