sql查找部分匹配字符串的行

时间:2013-03-09 19:52:15

标签: mysql sql

我想在表中找到包含字符串

的行的行

例如,我在一个名为'testing'的表中的列'atest'中有行 -

test
a
cool
another

现在我想使用sql选择字符串'这是一个测试'的单词

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

但这不是选择任何一行。

3 个答案:

答案 0 :(得分:1)

将参数反转为INSTR

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

答案 1 :(得分: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,而不是等式。 ("这是一个测试" - > ^这|是| a | test $)

如果表中有大量记录,则此查询可能会很慢。因为sql引擎在regexp查询中不使用索引。

因此,如果您的桌子上有很多行,并且没有超过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和单词字段。

比查询是:

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'

如果你的原始表有很多'这个查询可以更快地进行调整。记录,因为这里的sql引擎可以进行索引搜索。但是在原始表中插入一行时,还有一些工作要做,你必须在另外两个表中进行插入。

3个查询的运行时之间的结果取决于数据库表的大小。并且您希望针对插入或选择进行优化。 (插入/更新和选择查询之间的比率)

答案 2 :(得分:0)

全文索引 -

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