2

我需要设计一个子查询来选择列中具有匹配值的行。

例子

Select * 
from person 
where first_name in ('Java','SQL','Oracle');

然而,括号内的这个列表可能很大,最多 30,000 个值。我将从文件中读取值并将其传递到括号中。但是我认为我可以在括号内提供的值的数量可能会受到限制。是否有解决这种情况的最佳解决方案,而无需创建和加载包含数据的新表?

编辑:感谢您的回复。以下查询是要考虑的选项吗 -

Select * 
from person 
where first_name like 'Java' 
   or first_name like 'SQL' 
   or first_name like 'Oracle';

谢谢。

4

2 回答 2

4

我同意乔纳森的观点,合并 30000 个值不是这里的方法,他的解决方案是一个好方法。但这里有另一个想法,Oracle 有一个很好的特性,叫做外部表。

使用外部表,您可以将文件视为表。如果您的文件结构良好(如 CSV),您可以轻松使用此功能。

谷歌“Oracle 外部表”,您会发现很多信息和示例,但对于初学者来说,请阅读以下内容:

基本上,您需要一个目录对象来告诉 Oracle 您的文件所在的位置,然后您将创建外部表,可能如下所示:

create directory DIR_MYFILE as '/my_source_dir/';

create table EXT_MY_FILE
    ( 
      some_id    number(8),
      some_value varchar2(100)
    )
   organization external
   ( default directory DIR_MYFILE 
     access parameters
     ( records delimited by newline
       fields terminated by ','
     )
     location ('my_file.csv')  
 );

在查询中使用此表:

select * from person where first_name in (select some_value from EXT_MY_FILE);

编辑:见 APC 的评论,他有一个很好的观点。

于 2012-06-15T08:19:08.740 回答
1

如果您可以在 PL/SQL 中处理文件,那么流水线函数可能是另一种选择。

于 2012-06-15T08:27:42.183 回答