我必须根据字符串中搜索到的文本位置对列表进行排序,即如果搜索到的值首先出现在字符串中,那么它的位置应该是列表中的第一个,如果它出现在字符串中的第二个,那么它应该是第二个,但是所有的第一个单词作为搜索值的字符串应首先出现在列表中。
例如,输入字符串是:
- 克里斯是个好人
- 每个人都应该像克里斯一样
- 不是每个人都是克里斯
- 像克里斯这样的人很好
搜索的值为“人”。
输出应该是:
- 像克里斯这样的人很好
- 每个人都应该像克里斯一样
- 不是每个人都是克里斯
- 克里斯是个好人
我必须根据字符串中搜索到的文本位置对列表进行排序,即如果搜索到的值首先出现在字符串中,那么它的位置应该是列表中的第一个,如果它出现在字符串中的第二个,那么它应该是第二个,但是所有的第一个单词作为搜索值的字符串应首先出现在列表中。
例如,输入字符串是:
搜索的值为“人”。
输出应该是:
使用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
干杯。