0

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 |

しかし、:P5 に検索文字列が入力されていない場合に、:P5 で null を処理するようにクエリを変更する方法がわかりません。このクエリを試してみました

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

残念ながら、この場合、パフォーマンスは劇的に低下します。CONTAINS 関数で null 値を処理する方法はありますか?

4

2 に答える 2

0

1つの解決策はunion all次のとおりです。

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

whereOracle が次を使用して句を最適化するかどうかも確認できます。

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

オプティマイザーは を理解できませんが、 のcase方がうまく機能する可能性がありorます。

于 2016-07-20T12:29:13.540 に答える
0

これを試して。ゴードン・リノフ作例の一部改変例です

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: ODCIIndexStart() ルーチンの実行中にエラーが発生しました

使用する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 に答える