TSQL 排序结果,其中列包含列表中的所有值

TSQL order results where column contains all values from a list

我有一个带有标题列的电影 table。

  1. "The a"
  2. "the b"
  3. "the c"
  4. "the something"

当我使用输入 "the something" 查询该列时 - 我将返回所有标题包含 "the" 或 "something" 的电影。这就是我想要的。

我当前的问题是,我无法首先按包含输入中提供的所有单词的标题对结果进行排序。 由于 "the" 这个词含糊不清,很多标题都匹配它,而带有 "something" 的标题被埋在结果列表中。

在这个例子中,当我查询 "the something" - "the something" 应该排在最前面。但是由于查询匹配包含 "the" 和 "something" 的所有列,我不知道如何实现这一点。

我需要 Movies.Title 尽可能按包含 SplitStringTable 中所有值的列进行排序。如果可能的话。

我如何实现我的查询是通过在 table 上使用输入中提供的值列表执行 JOIN:

SELECT * FROM Movies m 
JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) SplitStringTable 
ON m.Title LIKE '%' + SplitStringTable .[Value] + '%'

任何关于如何实现这一点的想法都将不胜感激。

编辑:请大家原谅,我对我的场景的解释全错了。我将返回标题包含 SplitStringTable 中的任何值的任何记录。对于造成的混乱,我深表歉意。

您的查询将为每个匹配的单词 return 一行;因此您可以按 Movies 记录中的字段分组,然后按 ORDER BY count(*) DESC 中的字段分组。由于我不知道所有字段,所以我只能大致向您展示我的意思:

SELECT m.TITLE
  FROM      Movies m 
       JOIN (SELECT * FROM dbo.splitstring(@input, ' ')) s 
         ON m.Title LIKE '%' + s.[Value] + '%'
 GROUP BY m.TITLE
 ORDER BY count(*) DESC

但是除非 TITLE 是唯一的,否则这将无法正常工作。为了确保它对行进行正确排序,并能够看到所有其他字段,您需要在 GROUP BY 表达式中包含 Movies table 的每个字段。

顺便说一句,对于此类搜索,可能有比 SQL 更好的工具,尽管您可能会得到足够的结果。但我建议进行一项改进:

ON ' ' || m.Title || ' ' LIKE '% ' + s.[Value] + ' %'

可能有助于避免将 "the" 与 "theory"、"another" 等匹配。如果您始终可以依赖全字匹配,即...