oracle - Oracle Contains() 函数内的空格字符

标签 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 或 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 而不是 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 或 a},那么您也会获得与 b 匹配的结果。

关于oracle - Oracle Contains() 函数内的空格字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19629864/

相关文章:

sql - 选择 ColA=ColB 的行,并添加一个新列,告知 ColA 中的原始数据是否重复

sql - 在 Oracle 数据库中设置一个数字的特定位

Oracle 客户端 ORA-12541 : TNS:no listener

c# - ODP.NET 如何将字符串数组传递给 Oracle 存储过程?

hibernate - 如果没有更新完成,LockMode.WRITE是否释放锁

sql - 避免在 View 中使用子查询或分析功能进行全表扫描

sql - 使用单个 .sql 脚本文件创建多个表

java - 当我想要返回结果列表时,如何修复Java中的 "class java.lang.Long cannot be cast to class java.lang.Integer"错误?

sql - 根据事件数据创建 id 列

c# - 如何在执行 Oracle 插入语句后从触发器返回序列值?