使用花括号和通配符转义的 Oracle 文本
Oracle text escaping with curly braces and wildcards
我希望能够使用 contains
对 Oracle 文本查询中的搜索条件进行转义,并将转义条件与通配符结合使用以获得 "doubly truncated" 条件。 (我知道我的索引可能没有为理想的性能而设置,但这是多余的)。我希望能够使用花括号语法以获得最佳可读性,但这不起作用。根据这个相关(但不重复)问题的最佳答案,花括号定义了完整的标记。有什么方法可以禁用或解决此行为?
Oracle Text: How to sanitize user input
我宁愿避免在我的搜索条件中转义每个字符(根据我代码中的最后一个 select)或尝试在字符串中搜索特殊字符,因为保留字也被认为是 "special"。 (注意我没有停用词)下面演示了我的问题。 (不幸的是,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*', '([^*])', '\')) > 0
我希望能够使用 contains
对 Oracle 文本查询中的搜索条件进行转义,并将转义条件与通配符结合使用以获得 "doubly truncated" 条件。 (我知道我的索引可能没有为理想的性能而设置,但这是多余的)。我希望能够使用花括号语法以获得最佳可读性,但这不起作用。根据这个相关(但不重复)问题的最佳答案,花括号定义了完整的标记。有什么方法可以禁用或解决此行为?
Oracle Text: How to sanitize user input
我宁愿避免在我的搜索条件中转义每个字符(根据我代码中的最后一个 select)或尝试在字符串中搜索特殊字符,因为保留字也被认为是 "special"。 (注意我没有停用词)下面演示了我的问题。 (不幸的是,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*', '([^*])', '\')) > 0