2016-07-20 25 views
0

Oracle Apexで、Oracle Textによる表の全文検索でアプリケーションを開発しています。アプリケーションは、このようなクエリを持っている:それはドメイン索引CONTAINS関数のOracle Textバインド変数。 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がnullでない:場合

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

この場合、テキストインデックスは、正常に動作します検索文字列が入力されていない場合は、P5 にnullを処理するクエリ。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関数でnull値を扱う方法はありますか?

+0

があることができますように、それはcoditionを検索しません:。この「%WER」のようなP5別の言葉:ありバインド値で正規表現exprを使用していますか? –

答えて

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で良い仕事かもしれません。

+0

ORA-20090:Oracle Textエラー: :ORA-29902:ODCIIndexStart()でエラーが発生しました。DRG-50901:テキスト問合せ構文解析エラーがオンラインで発生しました。 1、column 1 –

+0

ORケースも非常に悪い性能を持っています –

+0

@ВикторШапошниковあなたには空白または空のスジを使用できません。私はあなたの質問クエリ(最初のもの)があなたが入れている場合に動作するのだろうか:P5 null?また、同じエラーが発生するはずです。 @EvgeniyK。 –

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'

関連する問題