【问题标题】:SQL basic full-text searchSQL 基础全文检索
【发布时间】:2011-09-23 20:09:52
【问题描述】:

我没有太多使用 TSQL 或 SQL Server 的全文搜索功能,所以请耐心等待。

我有一个像这样的表 nvarchar 列 (Col):

       Col  ... more columns
Row 1: '1'
Row 2: '1|2'
Row 3: '2|40'

我想进行搜索以匹配相似的用户。因此,如果我有一个 Col 值为“1”的用户,我希望搜索返回前两行。如果我有一个 Col 值为 '1|2' 的用户,我希望首先返回第 2 行,然后返回第 1 行。如果我尝试匹配 Col 值为 '4' 的用户,我不会得到任何结果.我想通过拆分我用来查询的值来做一个“包含”,但它不起作用,因为 '2|40' 包含 4...

我查看了有关使用“FREETEXT”关键字的文档,但我认为这对我不起作用,因为我基本上需要使用“|”将 Col 值分解为单词作为休息。

谢谢, 约翰

【问题讨论】:

  • 为什么CONTAINS 不起作用?
  • 我想要与字符串的每个部分完全匹配。 '|'本质上是值之间的中断。 '2' 和 '2|40' 应该匹配,但不匹配 '4' 和 '2|40'
  • 您是否只有 2 个值,或者第 4 行是否有类似 2|5|41 的值?

标签: tsql sql-server-2008 full-text-search


【解决方案1】:

您不应在字段中存储“1|2”之类的值来存储 2 个值。如果最多有 2 个值,则应使用 2 个字段来存储它们。如果你可以有 0 个值,你应该将它们存储在一个新表中,外键指向你的表的主键..

如果您的表中最多只有 2 个值。您可以像这样找到您的数据:

DECLARE @s VARCHAR(3) = '1'

SELECT * 
FROM <table> 
WHERE @s IN( 
    PARSENAME(REPLACE(col, '|', '.'), 1),  
    PARSENAME(REPLACE(col, '|', '.'), 2) 
    --,PARSENAME(REPLACE(col, '|', '.'), 3) -- if col can contain 3 
    --,PARSENAME(REPLACE(col, '|', '.'), 4) -- or 4 values this can be used
  )

Parsename 最多可以处理 4 个值。如果 'col' 可以包含超过 4 个值,请使用此

DECLARE @s VARCHAR(3) = '1'

SELECT * 
FROM <table> 
WHERE '|' + col + '|' like '%|' + @s + '|%'

【讨论】:

  • 是的,我就是这么想的。我正在使用 CMS,这就是它存储数据的方式。我将尝试您的第二个解决方案,但如果它的性能不够好,我将添加一个新表并更改所有内容以使用它。感谢您的信息。
【解决方案2】:

需要将它与没有 | 时的案例混合在一起。但这会返回左侧和右侧

      select left('2|10', CHARINDEX('|', '2|10') - 1)
      select right('2|10', CHARINDEX('|', '2|10'))

【讨论】:

  • 这个解决方案你会遇到一些问题。问题 1 'RIGHT' 部分仅在右侧比列左侧多 1 个字符时才有效。问题 2 如果没有 '|','LEFT' 部分会报错在列中
  • @t-clausen-dk 正如我所说“需要将它与没有 | 的情况混合在一起,但这会返回左侧和右侧”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多