0

我正在尝试根据名称从 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')

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

4

3 回答 3

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%'

也可以解决问题(并且不会比正则表达式慢,因为它们都不会使用索引)

于 2013-08-08T18:05:57.510 回答
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 %'

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

于 2013-08-08T18:18:31.200 回答
0

如果您想坚持使用正则表达式,请尝试

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

但是确实没有必要匹配是否总是以要比较的文字开头。

于 2013-08-08T18:42:49.870 回答