正则表达式在oracle中使用

时间:2013-08-08 17:58:23

标签: oracle

我试图根据名称从Oracle数据库中的表(名为userinfo)获取用户信息。

在数据库名称中可以像{"Ashwani Dahiya","Ashwani kumar","ashwani dahiya","ashwani kumar","Ashwani dahiya","ashwani Dahiya","ashwani"}

所以我想如果我搜索名称“ashwani”那么它应该返回上面的整个用户列表

select * 
from userinfo 
where regexp_like('name','Ashwani([[:space:]]* | [[:space:]]+[a-zA-Z0-9]*)','i')

我试过这个但是“没有找到结果”。

3 个答案:

答案 0 :(得分:3)

此表达式

regexp_like('name','Ashwani([[:space:]]* | [[:space:]]+[a-zA-Z0-9]*)','i')

字符串 'name'内搜索不在名为name的列内。如果要引用列,则不需要引号。

所以你需要你的表达:

regexp_like(name,'Ashwani([[:space:]]* | [[:space:]]+[a-zA-Z0-9]*)','i')

(请注意'周围缺少的单引号name

但我不认为这里需要正则表达式。一个简单的

where lower(name) like '%ashwani%'

也可以做到这一点(并且不会比正则表达式慢,因为它们都不会使用索引)

答案 1 :(得分:0)

我假设您打算使用名为NAME的列而不是文字“名称”,因此请尝试不使用名称旁边的引号,并且还会丢失“|”周围的空格:

select * from userinfo where regexp_like(name,'Ashwani([[:space:]]*|[[:space:]]+[a-zA-Z0-9]*)','i')

请注意,出于测试目的,您可以尝试使用如下文字:

select *
from dual
where regexp_like('ashwani ','Ashwani([[:space:]]*|[[:space:]]+[a-zA-Z0-9]*)','i')

正如a_horse_with_no_name所提到的,你可能会使用“LIKE”,但我猜你只是在寻找“ashwani”而不是“ashwaniX”(其中X是其他一些字母)你可以拥有它刚

lower(name) = 'ashwani' 
or lower(name) LIKE 'ashwani %'

正则表达式函数的问题在于,如果你处理大量数据,它们可能会相当慢。

答案 2 :(得分:0)

如果你想坚持正则表达式,请尝试

select * 
  from userinfo 
 where regexp_count(name, '^ashwani', 1, 'i') = 1
     ;

但实际上并不需要匹配的文字总是以文字来比较。