我想找到其中包含字符串SQL查找行部分匹配的字符串
例如,具有錶行的行,我在一個名爲「測試」表中的列名「ATEST」 M具有行 -
test
a
cool
another
現在我要選擇具有從字符串「這是測試」使用SQL
select * from testing where instr(atext, 'this is a test') >0;
但這不選擇任何行字行。
我想找到其中包含字符串SQL查找行部分匹配的字符串
例如,具有錶行的行,我在一個名爲「測試」表中的列名「ATEST」 M具有行 -
test
a
cool
another
現在我要選擇具有從字符串「這是測試」使用SQL
select * from testing where instr(atext, 'this is a test') >0;
但這不選擇任何行字行。
將參數取反到INSTR
。
WHERE INSTR('this is a test', atext)
這是一個「顛倒」,如:
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個查詢的運行時間之間的結果取決於您的數據庫表大小。而且你想優化插入或選擇。 (插入/更新和選擇查詢之間的比率)
全文索引 - 在編程語言
select * from anti_spam where match (atext) against ("this is a test" in boolean mode);
INSTR是MySQL的的反轉方式,搞笑爲什麼會這樣? – 2013-03-11 16:20:14
@PradyutBhattacharya我從來沒有在另一種編程語言中看過INSTR。我能想到的唯一模擬是PHP'strpos',它具有與MySQL相同的參數順序。 – 2013-03-11 16:27:34
instr非常有名,在javascript,vb中,每隔一種類型的舊lang ... – 2013-03-11 17:37:54