2013-08-08 5 views
0

Я пытаюсь получить информацию пользователя из таблицы (с именем userinfo) из базы данных Oracle на основе имени.Использование регулярных выражений в oracle

В базе данных имя может быть как {"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

Вы работаете с oracle 10 или новее? – collapsar

+0

буквальные пробелы в вашем шаблоне регулярных выражений будут сопоставлены - это означает, что «ашвани» не будут приняты. – collapsar

+0

Thanx collapsar Я получил свою ошибку. Спасибо много за то, что он работает ... –

ответ

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

также будет делать трюк (и не будет медленнее, чем регулярное выражение, потому что ни один из них будет использовать индекс)

+0

Я уже пробовал это без кавычек. И% ashwani% не будет искать строки, нечувствительные к регистру –

+0

@ user2665433: последнее предложение a_horse_with_no_name будет работать, потому что lowercased 'name 'сравнивается с шаблоном нижнего регистра. – collapsar

+0

@ user2665433: как collapsar сказал: он будет работать, потому что он сравнивается с 'lower (name)' –

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», но я предполагаю, что вы ищете просто «ашвани», а не «ashwaniX» (где X - другая буква), в котором вы могли бы есть только

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

Проблема с регулярными выражениями функций является то, что они могут быть довольно медленными, если вы работаете с большим количеством данных.

+0

@a_horse_with_no_name Я согласен с u, но как насчет чувствительности к регистру? –

+0

lower() преобразует все данные в нижний регистр перед сравнением. Пока сравниваемое значение также имеет строчные значения, у вас есть регистр без учета регистра: начните с «AsHwAnI», ниже («AsHwAnI») = «ashwani». –

+0

Thanx patrick, я получил свою ошибку, и я понял ваше предложение сейчас –

0

, если вы хотите, чтобы цепляться за регулярные выражения, попробуйте

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

, но на самом деле нет никакой необходимости, если матчи всегда будет начинаться с буквальным для сравнения.

Смежные вопросы