mysql - 搜索确切的单词短语而不使用正则表达式或rlike

时间:2016-01-04 19:27:21

标签: mysql regex

我的桌子是这样的:

|name           |
-----------------
|Joseph Jackson |
|Aiden Chase    |
|Luke Benjamin  |
|Joseph         |
|Joseph2        |

如果我搜索约瑟夫(SELECT * from myTable where name="Joseph")这个词,我只会得到最后的结果:

|name           |
-----------------
|Joseph         |

如果我搜索杰克逊这个词,我就不会得到任何结果。

这就是我不想要的。

我想要的是获取搜索到的确切单词中存在的记录,例如:

如果搜索到的单词是Joseph,我会得到:

|name           |
-----------------
|Joseph         |
|Joseph Jackson |

*请注意,Joseph2不在结果集中。

如果搜索到的单词是杰克逊,我会得到:

|name           |
-----------------
|Joseph Jackson |

*但我不能使用like '%Jose%'(使用喜欢)因为我会得到约瑟夫2而且我想要确切的字(何塞)。

*如果搜索的单词是Jose,例如我不应该得到任何结果,因为Jose不在数据中(我也不应该得到包含Joseph单词的记录)。

我发现的唯一方法就是使用正则表达式:

SELECT * from myTable where REGEXP [[:<:]]Joseph[[:>:]]     

|name           |
-----------------
|Joseph         |
|Joseph Jackson |


SELECT * from myTable where REGEXP [[:<:]]Jackson[[:>:]]

|name           |
-----------------
|Joseph Jackson |

我想要这个结果但是没有使用正则表达式和没有rlike,有什么办法吗?怎么样?感谢。

3 个答案:

答案 0 :(得分:4)

这对FULLTEXT搜索感到尖叫

ALTER TABLE T ADD FULLTEXT INDEX (name);

SELECT * FROM T WHERE MATCH (name) AGAINST ('+Joseph' IN BOOLEAN MODE);

FIDDLE

答案 1 :(得分:1)

允许存储过程接受@name的参数,然后可以使用WHERE子句

WHERE name = @name

答案 2 :(得分:1)

尽管@Mihai建议的全文绝对是生产的方式,但如果你想在不建立额外索引的情况下进行一次性搜索,你可以通过在名称和搜索周围添加空格来使用LIKE名称包括周围空格;

SELECT * FROM myTable
WHERE CONCAT(' ', name, ' ') LIKE CONCAT('% ', 'joseph', ' %')

请注意,这将肯定不使用任何索引,因此可用于管理目的,但不适用于无法处理全表扫描的生产应用程序。