mysql:查找具有“string”子字符串的字段的行

时间:2010-01-23 16:03:09

标签: java sql mysql jdbc

有没有办法编写一个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 个答案:

答案 0 :(得分:3)

如果必须在文字中找到NameNickname之一,请使用

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

没有索引可用于此,因此大型表可能需要很长时间。

答案 1 :(得分:2)

所有这些方法的一个问题是你的索引就在窗外。您必须对每一行进行表扫描,这意味着随着表大小的增加,您的性能将变得越来越差。

如果你的桌子很大,我会重新考虑这种方法。也许你需要一个像Lucene这样的索引搜索者。

答案 2 :(得分:1)

SELECT * FROM names WHERE INSTR(Nickname,Name) > 0;

或等同于:

SELECT * FROM names WHERE LOCATE(Name,Nickname) > 0;

答案 3 :(得分:1)

您也可以撤消LIKE条件。

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

注意,这可能不比instr(“谁是Rohit”,姓名)更快,但它可能是。