2017-01-12 39 views
0

我有一个Oracle表,它有近150k条记录和65列。我的客户有一个要求,他们需要用一个搜索值搜索整个表格,这也可以是通配符搜索。在Oracle表中搜索一个值

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

所以我构建了一个查询,它有全部65列来搜索单个字符串值。

样品查询:

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

查询是给某些字段输出,有时,如果我们通过一些地址相关领域它是失败的。

在某些情况下,特别是使用通配符类型搜索以及是否输出超过1000行时。

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

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

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

+1

如果你不使用通配符,我认为你可以做一个'WHERE:搜索IN(col1,col2,col3,...,col65)'。对于通配符,我认为你需要另一种方法。 –

回答

0

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

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

如果你的搜索条件是“CD”,这两个行会匹配,因为你是在所有列的串联搜索。

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>%' 
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,订单,寄回

fn:exists($i/*[contains(.,$var_text_to_serach)])词的首字母缩写 - 检查是否有列载模式。

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

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

使用这个例子中,你有test_example改变你的表,和照顾有关连接条件和。

0

考虑使用用户定义的数据存储上的所有列创建文本索引,然后搜索与包括运营商..

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') 
/

一个搜索与包含(NAME ,'Foo')应搜索索引的所有列。