Oracle的Contains()函数中的空格字符

时间:2013-10-28 08:14:31

标签: oracle oracle11g

我需要使用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 or b'

select * from theme
where contains(name, '{a or b}')>0;

但是我也得到'Pdz344_1_b'。但是没有'a''o'没有'r',我发现这个文本是匹配的,这一点非常令人惊讶。有没有我没有得到的关于contains()的语法?

1 个答案:

答案 0 :(得分:4)

CONTAINSLIKE运算符完全不同。由于它使用ORACLE TEXT搜索引擎(类似谷歌搜索),而不仅仅是字符串匹配。

{} - 是一个逃脱标记。意味着你放在里面的一切都应当被视为文本以逃避。

因此,您发出查询以查找看起来像a or b的文字,而不是ab。 因此,您的查询会与Pdz344_1_b匹配,因为其中包含b个字符。

a字符的行未匹配,因为default stop list中存在a字符。

为什么b不匹配?因为您的匹配序列实际上看起来像a\ or\ b。 我们有3个令牌a _or _b(下划线代表空格)。停止列表中的a_b行中没有字符b,因为只有一个字符。但我们在Pdz344_1_b行中确实有这种组合,因为非字母字符被视为空格。如果您移除{}或查询{b or a},那么您也会获得与b的匹配。