0

我正在尝试使用 like 语句过滤 sql 查询中的结果。这是结果

/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1
/addquestion
/addquestion/Validation
/q/how_do_you_get_a_hamster_out_of_a_wall/2

这些是存储在我的数据库中的 url。我想匹配这样的网址

/q/how_do_you_get_a_hamster_out_of_a_wall/2
/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1

这是我尝试过的:

select * from MyURLs where MYuri LIKE '/q/'

但它没有返回任何结果。对此有任何想法吗?

4

3 回答 3

3

您需要使用 % 作为通配符:

select * from MyURLs where MYuri LIKE '%/q/%'

这将在字段中的任何位置返回带有“/q/”的记录。如果您希望它以 '/q/' 开头但之后有任何内容,您可以使用:

select * from MyURLs where MYuri LIKE '/q/%'
于 2009-10-12T03:27:19.320 回答
2

Kaleb 已经为您提供了解决方案(并且 Joel 在评论中警告过索引性能),但我想建议另一条路线,该路线可以很好地扩展。如果您的表永远不会变得非常大,您可以忽略此建议。事实上,你可以一直忽略它,直到你预计性能会受到影响(或者性能实际上已经开始受到影响)——这就是 YAGNI 原则。

数据库的读取量几乎总是远远多于写入量。这意味着确定 URL 何时以“/q/”开头或包含“/q/”的正确时间是数据放入表中的时间,而不是每次提取它时。这会在所有读取中分摊计算成本(在写入时完成)。

对于这个可扩展的解决方案,您应该在表中有一个完全独立的列,例如"startsWithQ"or "hasQ"

然后,使用插入/更新触发器,根据放入表中的 URL 设置该列。

然后您的查询将变为:

select * from MyURLs where hasQ = 'YES'

并且,如果您在该列上有一个索引,您的查询将会尖叫。

如果您实际上查看大多数数据库问题,它们通常是“我的查询不够快”而不是“我的磁盘不够大”。用磁盘空间换取速度通常是最好的方法。

如果的搜索字符串是'/q/%'. 这应该在生产中定期进行分析 - 数据库很少设置和忘记,因为性能可能会根据表中的数据而变化 -衡量,不要猜测

如果搜索字符串是 ,它肯定会提供改进'%/q/%',除非您的数据库是那些非常罕见的野兽之一,它的写入次数多于读取次数。

于 2009-10-12T03:43:06.977 回答
1

如果你有很多这样的文本,创建一个全文目录,创建并填充一个全文索引,然后查询全文数据。其关键词:包含、freetext、containtable、freetexttable。sql server 2005 和 2008 具有强大的自由文本搜索功能。

于 2009-10-12T04:01:39.980 回答