在oracle SQL查询中使用string contains函数

iba*_*ght 37 sql oracle

我正在使用Oracle数据库,我想知道如何在varchar类型列中找到行,其中该列的值具有包含某些字符的字符串.

我正在尝试这样的事情(这是我想要的一个简单例子),但它不起作用:

select p.name
from   person p
where  p.name contains the character 'A';
Run Code Online (Sandbox Code Playgroud)

我也想知道我是否可以使用chr(1234)1234是ASCII代码而不是'A'我的示例查询中的字符的函数,因为在我的情况下我想在我的数据库中搜索一个人的名字包含8211字符的值作为ASCII码.

通过查询,select CHR(8211) from dual;我得到了我想要的特殊字符.

例:

select p.name
from   person p
where  p.name contains the character chr(8211);
Run Code Online (Sandbox Code Playgroud)

ADT*_*DTC 72

通过线我假设你的意思是表中的行person.你在寻找的是:

select p.name
from   person p
where  p.name LIKE '%A%'; --contains the character 'A'
Run Code Online (Sandbox Code Playgroud)

以上是区分大小写的.对于不区分大小写的搜索,您可以执行以下操作:

select p.name
from   person p
where  UPPER(p.name) LIKE '%A%'; --contains the character 'A' or 'a'
Run Code Online (Sandbox Code Playgroud)

对于特殊角色,您可以:

select p.name
from   person p
where  p.name LIKE '%'||chr(8211)||'%'; --contains the character chr(8211)
Run Code Online (Sandbox Code Playgroud)

LIKE运营商的模式相匹配.Oracle文档中详细介绍了此命令的语法.您将主要使用该%符号,因为它意味着匹配零个或多个字符.


iba*_*ght 23

ADTC的答案很好,但我找到了另一个解决方案,所以如果有人想要不同的东西,我会在这里发布.

我认为ADTC的解决方案更好,但我的解决方案也有效.

这是我找到的另一个解决方案

select p.name
from   person p
where  instr(p.name,chr(8211)) > 0; --contains the character chr(8211) 
                                    --at least 1 time
Run Code Online (Sandbox Code Playgroud)

谢谢.


Ant*_*yVO 8

CONTAINS您在示例查询和问题中使用了关键字。CONTAINS允许您搜索已使用 Oracle*Text 全文索引建立索引的列。

由于这些列是全文索引的,因此您可以有效地查询它们,以在文本列的任何位置搜索单词短语,而无需触发全表扫描。根据它们的用法,使用 LIKE 或 INSTR 几乎总是会导致全表扫描。

CONTAINS用于搜索单词短语。尽管有很多选项,但如果您要查找“A”或 chr(8211) 等嵌入字符,则不合适。

以下查询将返回文本中任意位置包含单词“smith”的所有行。

SELECT score(1), p.name
FROM person p
WHERE CONTAINS(p.name, 'smith', 1) > 0;
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请参阅: