如何解决具有20000个值的SQL In Clause
我有一个具有20000个ID的xls
我需要提取在Col1中具有这些ID的表的行
在Oracle SQL中有一种聪明的方法吗?
我对此数据库只有读权限。
我想对20000个ID进行切片,以便将前1000个放入变量p_list1中,然后将1000个放入变量p_list2中,并使用IN子句和并集来获取整个结果
但是我不习惯在查询中使用参数。
您可以复习一下吗?
预先感谢您的帮助
DECLARE
p_list1 VARCHAR2(10) := '''id1''','''id2''','''id3''',..ect
BEGIN
execute immediate 'select * from table1 where Col1 in ('|| p_list ||')' ;
END;
解决方法
如果您可以创建一个临时表,则可以按照以下方式进行操作:
- 创建临时表
- 使用EXISTS子句重新编写查询,如下所示:
SELECT *
FROM table1
WHERE EXISTS(select 1 from temp_table tt WHERE tt.id = table1.Col1)
,
一个方便的解决方法是使用元组列表而不是值列表。无论出于何种原因,Oracle在in
条件下允许超过2000个 tuple ,而不允许超过2000个值。
所以:
declare
p_list clob := '(1,''id1''),(1,''id2''),''id3'')';
begin
execute immediate 'select * from table1 where (1,col1) in ('|| p_list ||')' ;
end;
/
请注意,我将p_list
参数更改为CLOB;如果它将包含超过2000个值,则可能超过4000个字节。我还修复了单引号顺序。
如果参数来自代码外部,这仍然给您带来注入问题:在这种情况下,您确实想使用准备好的语句而不是execute immediate
(不过,可以使用相同的逻辑)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。