26

containsエスケープされた基準をワイルドカードと組み合わせて「二重に切り捨てられた」基準を使用して、Oracle テキストクエリで検索基準をエスケープできるようにしたいと考えています。(インデックスが理想的なパフォーマンスのために設定されていない可能性があることはわかっていますが、それは不要です)。読みやすくするために中括弧構文を使用できるようにしたいのですが、これは機能しません。この関連する (ただし重複していない) 質問に対する上位の回答によると、中括弧は完全なトークンを定義します。この動作を無効にするか、回避する方法はありますか?

Oracle Text: ユーザー入力をサニタイズする方法

予約語も「特別」と見なされるため、検索条件のすべての文字をエスケープする必要がないようにするか (コードの最後の選択に従って)、特殊文字の文字列を検索しようとします。(ストップワードがないことに注意してください) 以下は私の問題を示しています。(残念ながら、SQLFiddle は Oracle テキストをサポートしていないようです):

create table MY_TABLE(MY_COL varchar2(20));
insert into MY_TABLE(MY_COL) values ('abc');
insert into MY_TABLE(MY_COL) values ('abcd');
insert into MY_TABLE(MY_COL) values ('abcde');
insert into MY_TABLE(MY_COL) values ('bcd');
insert into MY_TABLE(MY_COL) values ('bcde');

create index FTIX on MY_TABLE (MY_COL)
indextype is CTXSYS.CONTEXT
PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST SYNC (ON COMMIT)');

select * from MY_TABLE where CONTAINS(MY_COL, '%bcd%') > 0; --expected results
select * from MY_TABLE where CONTAINS(MY_COL, '%{bcd}%') > 0; --no results
select * from MY_TABLE where CONTAINS(MY_COL, '{bcd}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '{%bcd%}') > 0; --returns bcd
select * from MY_TABLE where CONTAINS(MY_COL, '%\b\c\d%') > 0; --expected results
4

1 に答える 1

3

どうですか:

select * from MY_TABLE where CONTAINS(MY_COL, regexp_replace('*abc*', '([^*])', '\\\1')) > 0
于 2015-05-29T17:36:35.520 に答える