我试图根据名称从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')
我试过这个但是“没有找到结果”。
答案 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
;
但实际上并不需要匹配的文字总是以文字来比较。