一尘不染

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

sql

我希望能够在Oracle文本查询中使用来转义搜索条件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

阅读 240

收藏
2021-03-17

共1个答案

一尘不染

怎么样:

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