找到确切的文字

时间:2015-12-04 03:47:50

标签: sql sql-server

Text列为NVARCHAR(MAX)类型。

ID     Text
001    have odds and modds
002    odds>=12
003    modds
004    odds < 1

如何在文本列中搜索包含odds且不包含modds

的列

我试试:

Select * from MyTable
Where text LIKE '%odds%' AND text NOT LIKE '%modds%'

但结果不正确归还所有。我想要回归

    ID     Text
    001    have odds and modds
    002    odds>=12
    004    odds < 1

有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:2)

WHERE (text LIKE '%odds%' AND text NOT LIKE '%modds%') 
OR (text LIKE '%odds%odds%')

关于这是如何工作的一些问题。首先,SQL使用数据的“集合”,所以我们需要一个选择器(WHERE子句)来创建我们的“set”(如果没有包含它就是整个表“set”)

所以我们在这里创建了两个部分。

首先,我们在某处选择包含值“odds”的所有行,但不包括“modds”。这排除了仅包含“modds”的行。

其次,我们在其中包含其中包含两个“赔率”值的行 - “%”是一个通配符,以便从头开始分解它。

  • “'%'一开始的任何事情
  • “'%赔率”一开始就是“赔率”
  • “'%odds%”一开始的任何内容
  • “'%odds%赔率”开头的任何事情都跟在那之后,但之后有“赔率”
  • “'%odds%odds%'”开头时的任何东西%与“赔率”之间的任何东西介于%之间,“赔率”跟在最后的任何东西之后%

这适用于此特定情况,因为这两个单词都包含“赔率”,因此此处的顺序不具体。如果我们想用不同的词来做那些,例如“猫”,“猫”和“狗”,但只是“狗:我们会:

WHERE (mycolumn LIKE '%cats%' AND mycolumn NOT LIKE '%dogs%') 
OR ((mycolumn LIKE '%cats%dogs%') OR (mycolumn LIKE '%dogs%cats%'))

这也可以写成:(与AND一起使用)

WHERE (mycolumn LIKE '%cats%' AND mycolumn NOT LIKE '%dogs%') 
OR (mycolumn LIKE '%cats%' AND mycolumn LIKE '%dogs%')

这将捕获值而不考虑列中“cats”和“dogs”值的顺序。

请注意,对于最后两个解决方案示例,带括号的分组不是可选的。

答案 1 :(得分:0)

Select * from MyTable
Where text LIKE 'odds%'

答案 2 :(得分:0)

Select * from MyTable Where text LIKE '% odds%' or text LIKE 'odds%'

答案 3 :(得分:0)

最灵活高效的方法是使用全文搜索。这将为指定文本列中的每个单词创建索引。

此功能包含在(至少某些版本的)Microsoft SQL Server中。