хотите найти запись из таблицы на основе строки поиска - PullRequest
0 голосов
/ 08 сентября 2011

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

Вот что нам нужно: 1. В таблице ppl есть имя столбца, который содержит данные в формате имя, фамилия Скажи записи барак, Oba бар, обама и Барак, Обама.

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

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

Следуя подходам, которые мы пробовали до сих пор; но ничего из этого не сработало:

  1. выбрать имя из списка пользователей, где имя, например, 'bar,%' или имя, например, '%, bar'; Это работает для части имени, но не работает для части фамилии.

выберите имя из списка пользователей, где имя как 'oba,%' или имя как '%, oba'; не дает надлежащих результатов.

  1. выберите имя из списка, где имя = ЛЮБОЙ ('%, оба', оба,% '); - не работает

  2. выберите имя из списка пользователей, где regexp_like (name, '^, oba $') ИЛИ regexp_like (name, 'oba $, ^'); - не работает

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

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Вам необходимо использовать регулярное выражение (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');

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

0 голосов
/ 08 сентября 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                                                                       

Это верно.

* * 1010

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

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

...