我需要使用 Oracle 11g 的 Contains() 函数来搜索用户键入的某些字段中包含的某些精确文本。我被要求不要使用“like”运算符。
根据Oracle documentation ,要使一切正常工作,您需要:
- 两个
}
个字符 - 将整个输入放在
{}
之间
除了少数情况外,这在大多数情况下都有效。下面是一个测试用例:
create table theme
(name varchar2(300 char) not null);
insert into theme (name)
values ('a');
insert into theme (name)
values ('b');
insert into theme (name)
values ('a or b');
insert into theme (name)
values ('Pdz344_1_b');
create index name_index on theme(name) indextype is ctxsys.context;
如果'or'
运算符被解释,我将得到所有四个结果,但希望情况并非如此。现在,如果我运行以下命令,我希望只能找到 'a 或 b'
。
select * from theme
where contains(name, '{a or b}')>0;
但是我也得到'Pdz344_1_b'
。但是没有 'a'
,'o'
没有 'r'
,我发现这个文本匹配非常令人惊讶。有什么我不明白 contains() 语法的地方吗?
最佳答案
CONTAINS
根本不像LIKE
运算符。因为它使用 ORACLE TEXT
搜索引擎(类似于 google 搜索),而不仅仅是字符串匹配。
{}
- 是转义标记。意味着您放入其中的所有内容都应被视为要转义的文本。
因此,您发出查询来查找看起来像 a 或 b
而不是 a
或 b
的文本。
因此,您的查询会与 Pdz344_1_b
相匹配,因为它包含 b
字符。
仅包含 a
字符的行不匹配,因为 default stop list 中存在 a
字符.
为什么只是 b
不匹配?因为你的匹配序列实际上看起来像a\or\b
。
所以我们有 3 个标记 a
_or
_b
(下划线代表空格)。 a
在停止列表中,而 b
行中没有字符串 _b
,因为只有单个字符。但我们在 Pdz344_1_b
行中确实有这种组合,因为非字母字符被视为空格。如果您删除 {}
或查询 {b 或 a}
,那么您也会获得与 b
匹配的结果。
关于oracle - Oracle Contains() 函数内的空格字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19629864/