具有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;

解决方法

如果您可以创建一个临时表,则可以按照以下方式进行操作:

  1. 创建临时表
  2. 使用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(不过,可以使用相同的逻辑)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...