我没有使用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值分解为单词休息一下。
谢谢, 约翰
答案 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'))