-2

我必须根据字符串中搜索到的文本位置对列表进行排序,即如果搜索到的值首先出现在字符串中,那么它的位置应该是列表中的第一个,如果它出现在字符串中的第二个,那么它应该是第二个,但是所有的第一个单词作为搜索值的字符串应首先出现在列表中。

例如,输入字符串是:

  • 克里斯是个好人
  • 每个人都应该像克里斯一样
  • 不是每个人都是克里斯
  • 像克里斯这样的人很好

搜索的值为“人”。

输出应该是:

  • 像克里斯这样的人很好
  • 每个人都应该像克里斯一样
  • 不是每个人都是克里斯
  • 克里斯是个好人
4

2 回答 2

0

使用charindex()

order by charindex('person', column)

这假定该列具有字符串。

如果它没有字符串,您可以使用case表达式,或转换为NULL然后再转换为一个大值:

order by coalesce(nullif(charindex('person', column), 0), 999999)
于 2021-05-17T11:54:02.777 回答
0

您可以获取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

干杯。

于 2021-05-17T18:12:47.047 回答