我希望能够在Oracle文本查询中使用来转义搜索条件contains,并将转义的条件与通配符组合起来以具有“被双重截断”的条件。(我知道我的索引可能没有设置为理想的性能,但这是多余的)。我希望能够使用花括号语法来获得最佳的可读性,但这不起作用。根据这个相关问题(但不是重复问题)的最高答案,花括号定义了完整的标记。
contains
我宁愿避免不得不在搜索条件中转义每个字符(按照我的代码中的最后选择)或尝试在字符串中搜索特殊字符,因为保留字也被视为“特殊”字符。(请注意,我没有停用词)以下内容说明了我的问题。(不幸的是,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
怎么样:
select * from MY_TABLE where CONTAINS(MY_COL, regexp_replace('*abc*', '([^*])', '\\\1')) > 0