SQL查询 - 匹配字符串的任何部分

时间:2014-11-11 21:40:22

标签: mysql sql-server

我有一个包含名为DOC_NAME的VARCHAR列的表。 我想查询此列是否有任何字符串匹配,也接受部分匹配。

例如,该列包含:

“病毒和间谍软件在系统上的危险程度 - Techicode”

如果我搜索“病毒间谍软件”,我就没有结果。 我不想单独搜索每个单词,因为这可能会返回不相关的结果。 另外,我想搜索“关键字”而不是整个字符串。

我尝试过以下选项:

select * from docs where DOC_NAME like '%virus spyware%';

我也试过了:

SELECT * FROM docs WHERE DOC_NAME LIKE CONCAT('%','virus spyware','%')

但正如我所提到的,我没有任何结果。

我有一个可以使用的查询会返回一个值吗?

提前致谢。

4 个答案:

答案 0 :(得分:6)

select * from docs where DOC_NAME like '%virus%spyware%'

或者如果订单没有关系,只需要匹配:

select * from docs where DOC_NAME like '%virus%' or DOC_NAME like '%spyware%'

如果所有关键字都匹配使用AND而不是OR

答案 1 :(得分:4)

在MySQL中实现全文搜索有多种选择。原生方式是添加fulltext index,然后可以使用它来运行搜索,例如:

alter table docs
  add fulltext index doc_name_fti (doc_name);

select * 
from docs
where match(doc_name) against ('+virus +spyware' in boolean mode);

您还可以使用SphinxSolr等产品。

答案 2 :(得分:0)

SELECT doc_name FROM docs WHERE doc_name RLIKE '.*virus*spyware'

我发现LIKE语法不如PCRE熟悉。

然而,这可能是更高效的

SELECT FIELD('virus', doc_name) or FIELD('spyware', doc_name) from docs

答案 3 :(得分:0)

全文索引是实现这一目标的最佳方式。如果由于某种原因你不能并且必须使用LIKE,那么对于所有术语搜索:

select * from docs where DOC_NAME like '%virus%' and DOC_NAME like '%spyware%';

对于任何条款搜索:

select * from docs where DOC_NAME like '%virus%' or DOC_NAME like '%spyware%';