Oracle Text CONTAINS方法{}内不支持%通配符,如何兼容特殊字符搜索?
解决Oracle Text CONTAINS中同时使用通配符和特殊字符的问题
问题的核心在于:{}是Oracle Text的精确匹配语法,会把内部所有字符当作字面量(包括通配符%),所以你用{%oo~om}时,实际上是在搜索包含字面量%oo~om的内容,而不是以任意字符开头的oo~om。要同时实现通配符检索和特殊字符的字面匹配,得换用ESCAPE子句的方案:
具体实现步骤
- 选一个不在目标文本中出现的字符作为转义符(比如
\、#,选哪个都行,只要不冲突) - 在需要当作普通字符的特殊符号(比如你的
~)前面加上转义符 - 直接使用
%或_作为通配符(不用放到{}里) - 在
CONTAINS函数末尾加上ESCAPE '你的转义符',告诉Oracle Text哪些字符是转义后的字面量
示例代码
比如你要匹配任意字符开头、后面跟着oo~om的内容,执行这条语句:
SELECT * FROM CUSTOMER WHERE CONTAINS(NAME1, '%oo\~om', ESCAPE '\') > 0;
如果要精确匹配zoo~om(和你原来{zoo~om}的效果一样),可以写成:
SELECT * FROM CUSTOMER WHERE CONTAINS(NAME1, 'zoo\~om', ESCAPE '\') > 0;
为什么这个方案可行?
ESCAPE '\'明确告诉Oracle Text:\后面的字符是字面量,不需要解析成Oracle Text的特殊操作符(比如~默认是近似匹配的操作符,转义后就变成普通的波浪线了)%没有被转义,所以会被当作通配符解析,匹配任意长度的前缀
注意事项
- 转义符不能是你搜索文本里已有的字符,否则会把正常字符也转义了
- Oracle Text里的特殊字符不止
~,还有*、?、|等,只要需要当作字面量,都用转义符处理即可
内容的提问来源于stack exchange,提问作者Anant Khurana
相关产品推荐
相关产品推荐

