【问题标题】:MS-SQL 2008 Whole Word MatchesMS-SQL 2008 全字匹配
【发布时间】:2013-06-07 21:54:30
【问题描述】:

我花了几个小时研究这个问题,很困惑,可能是因为我经常使用 RegEx 表达式。

我希望在 Microsoft SQL 2008 的 VARCHAR 或 TEXT 类型列中匹配整个单词。

我有一个 CLR 程序集 RegEx Function installed

在这些示例案例中我需要它来匹配枪:

  • 上膛
  • 装弹
  • 我的上膛

在这些情况下不是:

  • 枪很棒
  • 我有我的枪
  • 我的枪很棒

我宁愿不走全文搜索路线。

以下是我尝试过但失败的一些事情:

WHERE PATINDEX( '%[^a-zA-Z_]' + @keyword + '[^a-zA-Z_]%', name) > 0

...不考虑字符串开头的单词

WHERE name LIKE '%\b' + @keyword + '\b%'

... 不返回任何内容

WHERE name LIKE '%[^A-Za-z]' + @keyword + '[^A-Za-z]%'

...不考虑字符串开头的单词

...还有一些我没有保存的东西

我似乎无法依靠诸如http://gskinner.com/RegExr/ 之类的正则表达式测试器来帮助我解决这个问题。任何帮助表示赞赏。

【问题讨论】:

  • 你真的在使用你的 CLR 正则表达式函数吗?你的例子看起来不像。
  • 我正在抓住这个秒针。我认为现有代码看起来与文档不匹配。我会看看我是否看不懂那些文档。谢谢。
  • 您没有使用任何 CLR 函数...只是本机 LIKEPatIndex 功能。

标签: sql regex sql-server-2008 tsql


【解决方案1】:

关键是修改name进行比较。只需在开头和结尾添加一个空格,然后您将获得所有单词。例如:

WHERE ' '+name+' ' LIKE '%[^A-Za-z]' + @keyword + '[^A-Za-z]%'

应该做得很好。

【讨论】:

  • 这将导致最大长度或最大长度减一的字符串出现问题。如果 name 是 VARCHAR(8000) 并且 LEN(name) 是 7999 那么' ' + name + ' ' 将没有终止空格,如果 LEN(name) 是 8000 那么' ' + name + ' ' 将截断最后一个字符并且没​​有终止空格。
  • @TT。如果这确实是一个问题,则将name 转换为varchar(max)
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2011-04-12
  • 2012-03-21
  • 1970-01-01
  • 2011-08-14
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多