SQL基本全文搜索

时间:2011-09-23 20:09:53

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

我没有使用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值分解为单词休息一下。

谢谢, 约翰

2 个答案:

答案 0 :(得分: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 + '|%'

答案 1 :(得分:0)

需要将其与没有|的情况混合使用但这会返回左侧和右侧

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