在Oracle表中搜索值

时间:2017-01-12 21:36:31

标签: php sql oracle

我有一个Oracle表,有近150k记录和65列。我的客户要求他们需要使用单个搜索值搜索整个表,并且也可以是通配符搜索。

最糟糕的是我使用php语言来做到这一点。

所以我构建了一个包含所有65列的查询来搜索单个字符串值。

示例查询:

SELECT * FROM <TABLE_NAME>
WHERE (col1 || col2 || col3 ... || col65) LIKE '%<SEARCH_VALUE>%'

查询为某些字段提供输出,如果我们传递一些与地址相关的字段,有时它会失败。

在某些情况下,特别是使用外卡类型搜索以及输出超过1000行。

我使用php语言完成了这些测试。但同时我尝试使用SQL Developer执行查询。它一直在给出结果。所以我感到困惑。

我试图访问的Oracle服务器上的更多是外部服务器,它不在我们的环境中。

请建议我如何实现此功能或想法,我真的很感谢你的助手。

4 个答案:

答案 0 :(得分:2)

如果您使用的是Oracle 11g,则可以向表中添加虚拟列

ALTER TABLE <TABLE_NAME> ADD
SEARCH_COLUMN GENERATED ALWAYS AS (col1 || ' ' || col2 || ' ' || col3 ... ||   col65);

然后在新创建的虚拟列上创建索引。索引将存储所有65列的连接字符串值。您不必更改应用程序中的任何查询,因为Oracle将使用其他65列的值自动计算虚拟列的值。

然后您可以使用索引虚拟列进行搜索

SELECT * FROM <TABLE_NAME>
WHERE SEARCH_COLUMN LIKE '%<SEARCH_VALUE>%'

答案 1 :(得分:0)

这看起来像一个非常可怕的设计。我想到的一个问题显示在下面的例子中

col1   col2
===========
ABC    DEF
CDX    ZZZ

如果你的搜索条件是&#34; CD&#34;,这两行都会匹配,因为你正在搜索所有列的串联。

答案 2 :(得分:0)

我正在使用这个技巧来搜索列并且我知道解决方案很慢。

create table test_example as  select * from user_objects where rownum <= 1000;

select t2.* from 
 xmltable('for $i in ora:view("test_example")/ROW
           where fn:exists($i/*[contains(.,$var_text_to_serach)])
           return $i' passing 'change_here' as "var_text_to_serach" columns id varchar(100) path 'OBJECT_ID') t1
     join test_example t2 on t1.id  = t2. OBJECT_ID
;

ora:view - 允许查询xquery表达式中的表。函数从表行创建xml-s。

xmltable - 允许将xquery-xml结果映射到关系模型。

FLWOR expresion - 在xmltable中我正在使用FLWOR expresion它是单词FOR,LET,WHERE,ORDER,RETURN

的首字母缩写词

fn:exists($i/*[contains(.,$var_text_to_serach)]) - 检查列中是否包含任何模式。

columns id varchar(100) path 'OBJECT_ID'从XML中提取id列。在我的示例中,OBJECT_ID是表中的uniquer值。

passing 'change_here' as "var_text_to_serach" - “change_here”是要搜索的文字

要使用此示例,您必须将test_example更改为您的表,并注意连接条件和。

答案 3 :(得分:0)

考虑使用用户定义的数据存储在所有列上创建文本索引,然后使用contains运算符进行搜索。

Sonething喜欢这个

 begin
   begin
     ctx_ddl.drop_preference('mymcds');
   exception
     when others then
     null;
  end;
  ctx_ddl.create_preference('mymcds', 'multi_column_datastore');
  ctx_ddl.set_attribute('mymcds', 'columns', 'NAME, POI_STREET_NAME,    
                                              POI_CITY, POI_POSTCODE, ACTUAL_ADDRESS');
end;
/
create index ADDRESS_SEARCH_IDX 
         on MAP_POI(NAME)
            indextype is ctxsys.context
            parameters ('datastore mymcds section group     ctxsys.auto_section_group')
/

使用contains(NAME,&#39; Foo&#39;)进行搜索时,应搜索所有已编入索引的列。