mysql: найти строки, у которых есть поле, являющееся подстрокой «string» - PullRequest
1 голос
/ 23 января 2010

есть способ написать SQL-запрос, который находит все строки, где значение поля является подстрокой данной строки.

Пример:

table names

Name      |      Nickname
rohit            iamrohitbanga
banga            rohitnick
sinan            unur

запрос должен быть что-то вроде

select * from names where Name is a substring of "who is rohit";   // to get first row
select * from names where Nickname is a substring of "who is rohitnick";   // to get second row
select * from names where Name is a substring of "who is unur and banga"
or Nickname is substring of "who is unur and banga";   // to get second and third row

Как это возможно?

Если это невозможно, тогда мне придется добиться такого поведения в Java. я использую драйвер jdbc: mysql для подключения к базе данных.

Обновление ваши решения работают

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

select * from names where Name is a substring of "who is sina";   // to get third row

Ответы [ 4 ]

3 голосов
/ 23 января 2010

Если в тексте нужно найти один из Name или Nickname, используйте

SELECT *
FROM names
WHERE instr("who is Rohit", Name) > 0
   OR instr("who is Rohit", Nickname) > 0

Для этого нельзя использовать индекс, поэтому для больших таблиц это может занять много времени.

2 голосов
/ 23 января 2010

Одна из проблем со всеми этими подходами - ваши индексы выходят прямо в окно. Вам придется выполнять сканирование таблицы для каждой строки, а это означает, что ваша производительность будет только ухудшаться с ростом размера таблицы.

Я бы переосмыслил этот подход, если ваш стол будет большим. Может быть, вам нужен индексированный поисковик, как Lucene.

1 голос
/ 23 января 2010

Вы также можете отменить условие LIKE.

select * from names where "who is rohit" LIKE  CONCAT('%', Name, '%');

Обратите внимание, что это, вероятно, не быстрее, чем instr ("Кто такой Рохит", Имя), но это может быть.

1 голос
/ 23 января 2010
SELECT * FROM names WHERE INSTR(Nickname,Name) > 0;

или, что эквивалентно:

SELECT * FROM names WHERE LOCATE(Name,Nickname) > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...