2013-03-09 61 views
0

我想找到其中包含字符串SQL查找行部分匹配的字符串

例如,具有錶行的行,我在一個名爲「測試」表中的列名「ATEST」 M具有行 -

test 
a 
cool 
another 

現在我要選擇具有從字符串「這是測試」使用SQL

select * from testing where instr(atext, 'this is a test') >0; 

但這不選擇任何行字行。

回答

1

將參數取反到INSTR

WHERE INSTR('this is a test', atext) 
+0

INSTR是MySQL的的反轉方式,搞笑爲什麼會這樣? – 2013-03-11 16:20:14

+0

@PradyutBhattacharya我從來沒有在另一種編程語言中看過INSTR。我能想到的唯一模擬是PHP'strpos',它具有與MySQL相同的參數順序。 – 2013-03-11 16:27:34

+0

instr非常有名,在javascript,vb中,每隔一種類型的舊lang ... – 2013-03-11 17:37:54

0

這是一個「顛倒」,如:

select * from testing where 'this is a test' LIKE CONCAT('%',atext,'%'); 

它可以在具有大量記錄的錶慢。 這將返回行,其中可以在給定字符串中找到atext列的值。 (例如,當atext ='是t時匹配,因爲它可以在給定的字符串中找到)

或者你可以寫一個正則表達式。

select * from testing where atext REGEXP '^(this|is|a|test)$'; 

這匹配所有行包含完全指定的單詞。 在你的腳本或編程語言中,你應該只用|並將^添加到字符串的開頭,將$添加到字符串的結尾,REGEXP不是等式。 (「This is a test」 - >^this | is | a | test $)

如果表中有很多記錄,則此查詢可能會很慢。因爲sql引擎不在正則表達式查詢中使用索引。

所以,如果你的桌子上有很多行,沒有超過4 000 000字,我建議做一個索引表。例如:

originalTable: 
tid | atext (text)   
1 | this is   
2 | a word   
3 | a this 
4 | this word  
5 | a is 
.... 



indexTable: 
wid | word (varchar) 
1 | this 
2 | is 
3 | a 
4 | word 


switchTable: 
tid | wid 
1 | 1 
1 | 2 
2 | 3 
2 | 4 
3 | 1 
3 | 3 
... 

您應該設置索引,tid,wid和word字段。

比查詢是:

SELECT o.* 
FROM originalTable as o 
JOIN switchTable as s ON o.tid = s.tid 
JOIN indexTable as i on i.wid=s.wid 
WHERE i.word = 'this' or i.word='is' or i.word='a' or i.word='test' 

此查詢可以是mutch更快,如果你有originalTable「很多」的記錄,因爲這裏的SQL引擎可以使索引搜索。但是,在原始表格中插入一行時,您還需要做更多的工作,您必須在其他兩個表格中進行插入。

3個查詢的運行時間之間的結果取決於您的數據庫表大小。而且你想優化插入或選擇。 (插入/更新和選擇查詢之間的比率)

0

全文索引 - 在編程語言

select * from anti_spam where match (atext) against ("this is a test" in boolean mode);