1

我在 TableA 中有以下数据...

ID | Text
---------------------------------------------
1  | let's find this document
2  | docments are closed

...如果我执行以下选择...

select Text from TableA where Text like '%doc%';

...我似乎得到了一个奇怪的结果。两行都返回。有了这个选择,它不仅应该返回第 1 行吗?我本来以为..

select Text from TableA where Text like 'doc%';

...会只返回第 2 行。我错过了什么吗?

作为我的搜索工具的一部分,我正在尝试对这些数据运行 3 次单独的搜索。第一个匹配是在字符串的开头查找指定的模式“doc”,其次,我的下一个匹配在字符串的末尾查找相同的模式,第三,确定该模式是否出现在文本中的任何位置- 所以可以有文字围绕它。理想情况下,第一次搜索只会匹配第 2 行,第二次搜索不会返回任何结果,第三次搜索只会返回第 1 行。

这样做的原因是我想尝试了解模式如何匹配字符串。可以更容易地阅读结果,以了解给定行的模式匹配 (a) 的开头,(b) 的结尾,(c) 中间的任何位置。

曾考虑使用正则表达式,但我的数据是 unicode。

4

2 回答 2

3

不,第一个查询返回两行,因为%意味着0个或更多字符。因此,如果doc是第一个出现在该字段中的东西,它也与该%doc%模式匹配。

但是您在第二个查询中是对的,它只会返回第 2 行。

于 2013-01-16T13:58:42.857 回答
1
  1. doc_%应该在开头匹配它,后面至少有一个字符。
  2. %_doc最后应该匹配它,在它之前至少有一个字符。
  3. %_doc_%应该在任何地方匹配它,前后至少有一个字符。

请注意,这些严格的标准无法找到确切的字符串“doc”,即在它之前或之后什么都没有。您可能希望通过放松它来将这种情况包括在查询 #1 中:

  1. doc%应该在开头匹配它,后面有任意数量的字符。
于 2014-12-11T16:38:52.433 回答