他们还会搜索他们名字的一部分。不仅是带空格的单词。 如果他们输入“马特”,我希望也能找回“马修”。
答案 0 :(得分:12)
SELECT *
FROM mytable
WHERE name LIKE 'matt%' OR name LIKE '[ ,-/]matt%'
注意:
1)花式通配符。不使用更简单的LIKE'%xyz%'形式的原因是,根据xyz,数据库可能返回许多不相关的记录。例如,“马特”搜索中的“杰夫·采尔马特”
第二个通配符键中的括号包括所有分隔符,这些分隔符可以指示单词之间的中断。另一种通配符模式是[^A-Z0-9]
(在搜索O'Brian
时可能会产生一些brian
但可能不是坏事...)
2)性能。由于此表中的记录太少,因此前面的通配符方法非常可行,当然也是最简单的方法。 没有理由继续搜索!
如果记录非常广泛(许多字段中的一些字段长度超过30个字符),则可以在name
上创建索引。前端通配符仍然需要扫描,但这将在较窄的索引上,因此更容易适应缓存等。
实际上,如果这个查询只针对myTable表中的几个字段[并且如果该表的记录是“宽”]而不是SELECT *
,那么您可以创建一个由所有这些字段组成的索引。
记录的数量是否会超过50,000(并且,在较小程度上,应用程序会以高于每分钟40次的速率使用类似查询“点击”数据库),您可以考虑引入更有效的处理方式关键字:全文目录或带有各个关键字的“手工制作”表。
3)另一种方法的优点。应用程序维护一个表,其中包含从全名中轻松解析的各个关键字列表的解决方案的优点,不仅提供了更好的扩展(当表和/或使用增长时),而且还引入了改进搜索的质量。
例如,它可以通过引入共同点来改善有效召回
常用的名字昵称(比尔或威尔或比利为威廉,迪克为理查德,杰克或约翰尼为约翰等)。通过更复杂的方法开辟的另一种可能性是引入Soundex或修改名称标记的Soundex编码,允许用户定位名称,即使它们可能错误拼写或忽略精确拼写(例如Wilmson vs. Wilmsen vs. Willmsonn等。)
答案 1 :(得分:10)
您可以使用:
SELECT *
FROM mytable
WHERE name LIKE '%matt%'
答案 2 :(得分:1)
您有以下选择:
LIKE
使用通配符......按照优先顺序排列。
答案 3 :(得分:0)
如果您尝试通过任何开发语言搜索名称,则可以使用Java中的正则表达式包。 像java.util.regex。*;
这样的东西