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

时间:2013-12-03 08:51:11

标签: sql oracle

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

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

select p.name
from   person p
where  p.name contains the character 'A';

我还想知道我是否可以使用像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);

3 个答案:

答案 0 :(得分:61)

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

select p.name
from   person p
where  p.name LIKE '%A%'; --contains the character 'A'

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

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

对于特殊角色,你可以这样做:

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

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

答案 1 :(得分:21)

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

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

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

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

谢谢。

答案 2 :(得分:1)

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

因为这些列是全测试索引的,所以您可以高效地查询它们以搜索短语的任何地方与文本列,而无需触发全表扫描。根据它们的使用情况,使用 LIKE 或 INSTR 几乎总是会导致全表扫描。

CONTAINS 用于搜索短语。尽管有很多选项,但如果您要查找诸如 'A' 或 chr(8211) 之类的嵌入字符,这并不合适。

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

SELECT score(1), p.name
FROM person p
WHERE CONTAINS(p.name, 'smith', 1) > 0;

更多详情请见: