Oracle如何在where子句中使用数组?

问题描述 投票:0回答:2

我想将值存储在数组中,然后在where子句中使用它。

像这样:

SELECT ... ... 
  FROM myTable 
 WHERE (myTable.id, myTable.type) 
    IN (SELECT * 
          FROM table(array_collection)
       )

array_collection 值如下:

  (('1','N'),
   ('2','N'),
   ('3','Y'))

有什么办法不创建架构级别

table
类型来做到这一点?

oracle plsql
2个回答
3
投票

我想将值存储在数组中。

这就是您存储价值的方式:

CREATE OR REPLACE TYPE array_item IS object( id NUMBER, TYPE varchar2(3));

CREATE OR REPLACE TYPE array_collection IS VARRAY(10) OF array_item;


declare
--Initialization 
var_array array_collection:=array_collection();
begin
  ---Storing 3 elements
 var_array.extend(3);
 var_array(1):= array_item(1,'N');
 var_array(2):= array_item(2,'N');
 var_array(3):= array_item(3,'Y');

 for i in 1..var_array.count
 loop
  dbms_output.put_line( var_array(i).id ||'    '|| var_array(i).TYPE );
 end loop;

end;

您可以用作:

SELECT ... ... 
  FROM myTable 
 WHERE (myTable.id, myTable.type) MEMBER OF var_array ;

0
投票

如果您仅限于使用 SQL 并且无法使用 PL/SQL 或创建自定义对象,您仍然可以通过使用字符串操作和 IN 运算符的组合来实现此目的。然而,这种方法的动态性较差,并且由于查询长度的限制,可能不适合处理大型值数组。

以下是在 SQL 中执行此操作的方法:

选择* 来自你的表 WHERE your_column IN ( 选择 regexp_substr(:your_api_values, '[^,]+', 1, LEVEL) 从双 CONNECT BY regexp_substr(:your_api_values, '[^,]+', 1, LEVEL) 不为空 );

© www.soinside.com 2019 - 2024. All rights reserved.