我正在使用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函数中处理空值吗?
答案 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
如果您使用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'