我有一个Oracle表,有近150k记录和65列。我的客户要求他们需要使用单个搜索值搜索整个表,并且也可以是通配符搜索。
最糟糕的是我使用php语言来做到这一点。
所以我构建了一个包含所有65列的查询来搜索单个字符串值。
示例查询:
SELECT * FROM <TABLE_NAME>
WHERE (col1 || col2 || col3 ... || col65) LIKE '%<SEARCH_VALUE>%'
查询为某些字段提供输出,如果我们传递一些与地址相关的字段,有时它会失败。
在某些情况下,特别是使用外卡类型搜索以及输出超过1000行。
我使用php语言完成了这些测试。但同时我尝试使用SQL Developer执行查询。它一直在给出结果。所以我感到困惑。
我试图访问的Oracle服务器上的更多是外部服务器,它不在我们的环境中。
请建议我如何实现此功能或想法,我真的很感谢你的助手。
答案 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;)进行搜索时,应搜索所有已编入索引的列。