2010-01-23 49 views
0

有沒有辦法編寫一個sql查詢來查找字段值是給定字符串的子字符串的所有行。mysql:找到有字段是「字符串」的子字符串的行

例子:

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 
+1

對於那些提供答案以便事後更改標準的人來說,這是不尊重的。 – 2010-01-23 20:24:06

+1

@iamrohitbanga:我同意'OMG小馬'。海報不會收到通知,說明你改變了你的問題,所以大多數人不會更新他們的答案。如果您的初始問題得到解決,請接受答案並隨時添加另一個問題。此外,我沒有看到你的新查詢('名稱是東西的子字符串)和原始查詢('名稱是東西的子字符串) – 2010-01-23 21:17:47

+0

同意!你是對的 – 2010-01-24 07:00:20

回答

3

如果NameNickname一個有文字中找到使用

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

沒有索引,可用於這一點,所以它可能需要很長時間的大表。

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

或等價:

所有這些方法
SELECT * FROM names WHERE LOCATE(Name,Nickname) > 0; 
+0

沒有。 fireeyedboy似乎做得正確。我會測試一下。無論如何你指出了相同的功能。 – 2010-01-23 16:20:42

+0

對不起,我不明白那個問題。 :) 但是沒問題。 – 2010-01-23 17:10:57

2

的一個問題是你的指標向右走窗外。您必須爲每一行執行表掃描,這意味着隨着表大小的增長,您的性能只會越來越差。

我想重新考慮這種方法,如果你的表會很大。也許你需要像Lucene這樣的索引搜索器。

+0

我記得lucene。但現在我想要簡單的原型。 – 2010-01-23 16:21:49

+0

懷疑我的確有我的領域通常很小。所以值得爲每一行創建一個Lucene'Document'。 Lucene會根據測量頻率的tf/idf匹配文檔。所以我的文件都很小。 lucene是一個不錯的選擇。 – 2010-01-23 16:23:46

1

您也可以反轉LIKE條件。

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

請注意,這可能不比instr(「誰是Rohit」,Name)快,但它可能是。

相關問題