CONTAINS函数中的Oracle Text绑定变量。如何处理空值?

时间:2016-07-20 12:27:55

标签: sql oracle performance oracle-apex-5 oracle-text

我正在使用Oracle Text在桌面上使用全文搜索在Oracle Apex上开发一个应用程序。应用程序有这样的查询:

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

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

|  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 |

但我不知道如何更改我的查询以处理null: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函数中处理空值吗?

2 个答案:

答案 0 :(得分: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可能会更好。

答案 1 :(得分: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 executing 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'

那样搜索