0

我正在 Oracle Apex 上开发一个应用程序,通过 Oracle Text 在表格上进行全文搜索。应用程序有这样的查询:

select task_id, ...
from vhd_tasks 
where contains(hw_sn, :P5)>0

在这种情况下,文本索引工作正常,如果 :P5 不为空,因为它使用域索引

|  60 |                         TABLE ACCESS BY INDEX ROWID| HD_TASKS          |  1257 |   326K|   322   (0)| 00:00:04 |
|* 61 |                          DOMAIN INDEX              | CTX_HD_TASKS      |       |       |     4   (0)| 00:00:01 |

但是当搜索字符串未填充到:P5 时,我不知道如何更改我的查询以处理:P5 中的空值。我试过这个查询

select task_id, ...
from vhd_tasks 
where ( case when :P5 is not null then  contains(hw_sn, :P5, 1)
       else 1 end)>0

不幸的是,在这种情况下性能会急剧下降。知道如何处理 CONTAINS 函数中的空值吗?

4

2 回答 2

0

尝试这个。这是 Gordon Linoff 示例的一些修改示例

select *
from Oracle_text 
where :P5 is not null and contains(object_name, :P5)>0
union all
select *
from Oracle_text 
where :P5 is null and object_name is null

但要小心。看看这个ORA-29902: error in execution ODCIIndexStart() routine ORA-20000: Oracle Text error: DRG-50901: text query parser syntax error on line 1, column 19

如果你使用exec :P5 = 'PB',那么你会得到错误 ORA-29902。这里的所有保留字(https://docs.oracle.com/cd/B19306_01/text.102/b14218/cqspcl.htm)。然后你可以像这样转义整个字符串。(也在链接中注明)

select task_id, ...
from vhd_tasks 
where contains(hw_sn, '{' || :P5 || '}') > 0

但它不会像这样搜索代码'%DUAL'

于 2016-07-20T13:32:21.433 回答
0

一种解决方案是union all

select task_id, ...
from vhd_tasks 
where contains(hw_sn, :P5) > 0
union all
select . . .
from vhd_tasks
where :P5 is null;

您还可以查看 Oracle 是否会where使用以下方法优化子句:

where :P5 is null or contains(hw_sn, :P5, 1) > 0

优化器不会理解case,但它可能会更好地与or.

于 2016-07-20T12:29:13.540 回答