【问题标题】:SQL server sort contains resultSQL 服务器排序包含结果
【发布时间】:2015-07-24 08:28:18
【问题描述】:

我想在 SQL Server 中编写一个查询,在某些列中搜索一些单词并根据匹配单词的数量对结果进行排序。例如在blow中,结果的顺序必须是:Row2,Row3,Row1。

搜索字符串:w1 w2 w3

Row1:column1=w1 w4 column2=w5 w6 ==> 匹配词w1
第 2 行:column1=w1 w2 column2=w3 w4 ==> 匹配词:w1w2w3
第 3 行:column1=w1 w2 column2=w5 w6 ==> 匹配词:w1w2
第 4 行:column1=w5 w6 column2=w7 w8 w9

我的代码:select * from Table1 where contains((col1,col2),@search))

【问题讨论】:

  • where ... 按 col1 排序
  • 谢谢,但是在这个例子中 col1 有最多的搜索字符串,当用一列排序时,该列的优先级变高,我不想要这个。
  • 不太明白你在这里问什么,你能尝试添加更多细节或更清晰的例子吗?
  • 好的!我正在编辑问题。
  • 您想要匹配单词的总数,还是字符串本身?

标签: sql-server tsql


【解决方案1】:

实现它的简单方法:

;WITH 

words_to_search as (
   select 'w1' w union all   
   select 'w2' w union all   
   select 'w2' w ), 

searching as (
   select Id 
   from your_table t 
   inner join words_to_search w 
     on t.column1 + t.column2 like '%' + w.w + '%' ),

ranking_it as (
   select Id, count(*) as n
   from searching
   group by Id )

select * 
  from ranking_it r -- joining your table if you need
 order by r.n;

注意性能,concat 和 like 操作会很糟糕。

【讨论】:

  • 很好,但我使用Full-text indexed 列和contains 以获得最佳性能。
  • @Micle,当然你可以把like改成contains,像这样:contains((col1,col2),w))
  • 我试过这个并将其更改为使用contains 会产生错误Incorrect syntax near 'w'.
【解决方案2】:

查看CONTAINSTABLE 语句,它可以帮助您通过匹配排名来对结果进行排序。

create table Table1 (id int primary key identity(1,1), col1 varchar(100), col2 varchar(100));
GO
create fulltext catalog Test AS DEFAULT;
GO
create fulltext index on Table1(col1, col2) 
key index PK__Table1__3213E83FFB568640 ON Test; 
GO

insert into Table1 (col1, col2)
values
   ('w1 w4','w5 w6')
  ,('w1 w2','w3 w4')
  ,('w1 w2','w5 w6')
  ,('w5 w6','w7 w8 w9')

declare @search varchar(100) = 'w1 or w2 or w3';

select * from Table1 T
join CONTAINSTABLE(Table1, (col1,col2), @search) AS M ON T.ID = M.[KEY]
order by M.[RANK] DESC; 

【讨论】:

  • @Jamiec 也许会有所帮助
  • 我试过这个,对于具体的例子,座位术语w1 w2 w3 错误 - 它必须是w1 or w2 or w3,但是每行匹配都会带回相同的排名。
  • @Jamiec 奇怪的是,这是我的结果(Id-Rank):2 - 48、3 - 32、1 - 32
  • 我得到 1-48、2-48、3-48。确实很奇怪。两者都不会给 OP 他们想要的东西!
  • 对我来说得到:1-128,2-128,3-128!
猜你喜欢
  • 2020-07-09
  • 2014-06-02
  • 2016-02-11
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多