问题描述
我必须根据字符串中搜索到的文本位置对列表进行排序,即如果搜索到的值首先出现在字符串中,那么它的位置应该是列表中的第一个,如果它出现在字符串中的第二个,那么它应该是第二个但所有第一个词作为搜索值的字符串应该首先出现在列表中。
例如,输入字符串是:
- 克里斯是个好人
- 每个人都应该像克里斯
- 不是每个人都是克里斯
- 像克里斯这样的人很好
搜索的值为“person”。
输出应该是:
- 像克里斯这样的人很好
- 每个人都应该像克里斯
- 不是每个人都是克里斯
- 克里斯是个好人
解决方法
使用charindex()
:
order by charindex('person',column)
这里假设列有字符串。
如果没有字符串,可以使用case
表达式,或者先转换为NULL
再转换为大值:
order by coalesce(nullif(charindex('person',column),0),999999)
,
您可以获取 NGrams8k 的副本并通过多种方式分析字符串。这将按位置排序并返回它。
结果:
Txt Position
------------------------------------ ----------
person like chris are good 1
Every person should be like chris 7
Not every person is chris 11
Chris is a good person 17
如果您将搜索文本更改为“Chris”,您会得到:
Txt Position
----------------------------------- --------------------
Chris is a good person 1
person like chris are good 13
Not every person is chris 21
Every person should be like chris 29
您可以使用 NGrams8K 执行的其他操作是按搜索字符串的出现次数排序。
--==== Searching by number of occurances
INSERT @t VALUES('Chris said "person",what a person'),('Person person and more persons');
SET @search = 'Person';
SELECT t.Txt,Occurances = COUNT(*)
FROM @t AS t
CROSS APPLY samd.ngrams8k(t.txt,LEN(@search)) AS ng
WHERE ng.Token = @search
GROUP BY t.Txt
ORDER BY -COUNT(*);
退货:
Txt Occurances
------------------------------------ -----------
Person person and more persons 3
Chris said "person",what a person 2
Every person should be like chris 1
Not every person is chris 1
person like chris are good 1
Chris is a good person 1
干杯。