хотите найти запись из таблицы на основе строки поиска

Мы хотим найти запись в таблице на основе строки поиска. Этот поиск является частью хранимой процедуры.

Вот что нам нужно: 1. В таблице ppl есть имя столбца, которое содержит данные в формате имени, фамилии. Скажем, записи: barack, oba bar, obama и barack, obama.

  1. Мы хотим выбрать запись на основе строки поиска. Строка поиска может быть именем ИЛИ фамилией.
  2. Нам нужен точный поиск на основе строки поиска. Означает, что строка поиска является баром; он не должен возвращать запись barack,obama и должен возвращать только bar,obama. Аналогичный точный поиск по части фамилии.

  3. Мы не знаем, будет ли в строке поиска имя или фамилия. Таким образом, строка поиска может быть даже «oba»... и она должна возвращать только запись «barack,oba».

Следующие подходы мы пробовали до сих пор; но ни один из них не работал:

  1. выберите имя из ppl, где имя типа «бар,%» или имя типа «%, бар»; Это работает для части имени, но не работает для части фамилии.

выберите имя из ppl, где имя типа «oba,%» или имя типа «%, oba»; не дает должных результатов.

  1. выберите имя из ppl, где name = ANY('%,oba',oba,%'); - не работает

  2. выберите имя из ppl, где regexp_like (имя,'^,oba$') ИЛИ regexp_like (имя,'oba$,^'); - не работает

Прошу вас поделиться своими мыслями в этом случае.


person adi    schedule 08.09.2011    source источник
comment
Я не понимаю, почему вы говорите, что name like 'bar,%' or name like '%,bar' не работает. Это для меня. Конечно, у вас нет никого с фамилией "бар"...   -  person Tony Andrews    schedule 08.09.2011
comment
Это не работает для части фамилии, означает, что имя типа «%, oba» или имя типа «oba,%» не работает :(   -  person adi    schedule 08.09.2011
comment
Есть ли еще условия в запросе? Вы не можете успешно смешивать И и ИЛИ, не используя круглые скобки.   -  person Tony Andrews    schedule 08.09.2011


Ответы (2)


Вам нужно использовать регулярное выражение (REGEX).

Есть много сайтов, которые описывают, как их использовать, например:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

http://www.dba-oracle.com/t_regular_expressions.htm

http://orafaq.com/node/2404

Для примеров, которые вы описали (поскольку это все, что мне нужно сделать), вы можете использовать:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'c') > 0;

Программная замена строки имени на v_name. Если строка имени должна искаться без учета регистра, то:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'i') > 0;

РЕДАКТИРОВАТЬ: вы, вероятно, могли бы использовать REGEXP_LIKE лучше, чем REGEXP_INSTR, но у меня было что-то похожее на руку.

например Без учета регистра:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'i');

Деликатный случай:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'c');

Надеюсь это поможет...

person Ollie    schedule 08.09.2011

Основываясь на данных примера и SQL вашего вопроса, я не вижу, что у вас есть проблема:

Сначала я реплицировал вашу таблицу и данные (используя SQL Plus):

SQL> create table ppl (name varchar2(30));

Table created.

SQL> insert into ppl values ('barack,oba');

1 row created.

SQL> insert into ppl values ('bar,obama');

1 row created.

SQL> insert into ppl values ('barack,obama');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ppl;

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      
bar,obama                                                                       
barack,obama                                                                    

Теперь ваши запросы:

SQL> select * from ppl where name like 'bar,%' or name like '%,bar';

NAME                                                                            
------------------------------                                                  
bar,obama                                                                       

Это правильно.

SQL> select * from ppl where name like 'oba,%' or name like '%,oba';

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      

Это тоже правильно.

Итак, какие результаты вы получаете?

person Tony Andrews    schedule 08.09.2011