我的桌子是这样的:
|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,有什么办法吗?怎么样?感谢。
答案 0 :(得分:4)
这对FULLTEXT搜索感到尖叫
ALTER TABLE T ADD FULLTEXT INDEX (name);
SELECT * FROM T WHERE MATCH (name) AGAINST ('+Joseph' IN BOOLEAN MODE);
答案 1 :(得分:1)
允许存储过程接受@name的参数,然后可以使用WHERE子句
WHERE name = @name
答案 2 :(得分:1)
尽管@Mihai建议的全文绝对是生产的方式,但如果你想在不建立额外索引的情况下进行一次性搜索,你可以通过在名称和搜索周围添加空格来使用LIKE
名称包括周围空格;
SELECT * FROM myTable
WHERE CONCAT(' ', name, ' ') LIKE CONCAT('% ', 'joseph', ' %')
请注意,这将肯定不使用任何索引,因此可用于管理目的,但不适用于无法处理全表扫描的生产应用程序。