Oracle文本使用花括号和通配符转义

时间:2015-05-12 14:53:21

标签: sql oracle oracle-text

我希望能够使用contains在Oracle文本查询中转义搜索条件,并将转义后的条件与通配符结合使用,以便"双重截断"标准。 (我知道我的索引可能没有设置为理想的性能,但这是多余的)。我希望能够使用花括号语法以获得最佳可读性,但这并不起作用。根据这个相关(但不重复)问题的最佳答案,花括号定义完整的标记。有没有办法禁用或解决此问题?

Oracle Text: How to sanitize user input

我宁愿避免在我的搜索条件中逃避每个字符(根据我的代码中的最后一个选择)或尝试搜索字符串中的特殊字符,因为保留字也被视为"特殊" 。 (请注意,我没有停止的话)以下是我的问题所在。 (不幸的是,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

1 个答案:

答案 0 :(得分:3)

怎么样:

select * from MY_TABLE where CONTAINS(MY_COL, regexp_replace('*abc*', '([^*])', '\\\1')) > 0