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

标签 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

最佳答案

怎么样:

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

关于sql - 使用花括号和通配符转义 Oracle 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194480/

相关文章:

mysql - SQL查询不返回空值

mysql - 如何用sql更新一个列两次

SQL 返回 2008 年第 13 周的结果(未分组)

sql - 根据每行中的列值重复行

oracle - Oracle是否支持全文搜索?

oracle - 如何在Oracle的CONTAINS运算符中获得text_query的4000个字符左右的限制?

c# - Dapper-“必须声明标量变量@VersionId”

SQL Server : increment INT column using variable

java - 使用注释在 Hibernate 中使用复合主键

sql - 姓名查询数据库建议