Sql server SQL server排序包含结果

Sql server SQL server排序包含结果,sql-server,tsql,Sql Server,Tsql,我想在SQLServer中编写一个查询,在某些列中搜索一些单词,并用匹配的单词数对结果进行排序。例如,在打击中,结果的顺序必须为:第2行、第3行、第1行 搜索字符串:w1 w2 w3 行1:column1=w1w4column2=w5w6=>匹配字:w1 第2行:column1=w1w2column2=w3w4=>匹配词:w1w2w3 第3行:column1=w1w2column2=w5w6=>匹配字:w1w2 第4行:column1=w5w6column2=w7w8w9 我的代码:从表1中选择

我想在SQLServer中编写一个查询,在某些列中搜索一些单词,并用匹配的单词数对结果进行排序。例如,在打击中,结果的顺序必须为:第2行、第3行、第1行

搜索字符串:
w1 w2 w3

行1:column1=
w1w4
column2=
w5w6
=>匹配字:
w1

第2行:column1=
w1w2
column2=
w3w4
=>匹配词:
w1
w2
w3

第3行:column1=
w1w2
column2=
w5w6
=>匹配字:
w1
w2
第4行:column1=
w5w6
column2=
w7w8w9

我的代码:
从表1中选择*其中包含((col1,col2),@search))

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

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; 
看看这个语句,它可以帮助你们通过匹配排名对结果进行排序

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; 

实现此目标的简单方法:

;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和类似的操作会很糟糕

实现这一目标的简单方法:

;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和类似的操作会很糟糕

在哪里。。。按col1thanks排序,但仅在本例中,col1具有最多的搜索字符串,当使用一列进行排序时,该列的优先级会很高,我不希望出现这种情况。我不太明白您在这里提出的问题,您能否尝试添加更多详细信息或更清晰的示例?好的!我有一个编辑问题。你想要匹配单词的总数,还是字符串本身?在哪里。。。按col1thanks排序,但仅在本例中,col1具有最多的搜索字符串,当使用一列进行排序时,该列的优先级会很高,我不希望出现这种情况。我不太明白您在这里提出的问题,您能否尝试添加更多详细信息或更清晰的示例?好的!我有一个编辑问题。你想要匹配单词的总数,还是字符串本身?@Jamiec也许会有帮助。我尝试过这个,对于特定的例子,seatch术语
w1 w2 w3
错误-它必须是
w1或w2或w3
,但是每一行匹配都会返回相同的排名。@Jamiec奇怪,这是我的结果(Id排名):2-48,3-32,1-32我得到1-48,2-48,3-48。真奇怪。不过,两人都不会给OP他们想要的东西!对我来说:1-128,2-128,3-128@Jamiec可能会有帮助我尝试过这个,对于特定的例子,seatch术语
w1 w2 w3
错误-它必须是
w1或w2或w3
,但是每一行匹配都会返回相同的排名。@Jamiec奇怪的是,这是我的结果(Id排名):2-48,3-32,1-32我得到1-48,2-48,3-48。真奇怪。不过,两人都不会给OP他们想要的东西!对我来说:1-128,2-128,3-128!很好,但是我正在使用
全文索引的
列和
包含
以获得最佳性能。@当然,Micle,您可以通过
包含
来更改
类似的
,如下所示:
包含((col1,col2),w))
。我尝试过使用
contains
并将其更改为使用
contains
会产生错误
靠近“w”的语法不正确。
很好,但我使用
全文索引的
列和
contains
来获得最佳性能。@Micle,当然,您可以通过
contains
来更改
类似的
,例如:
contains((col1,col2),w))
。我尝试了这个方法,并将其改为使用
contains
会在“w”附近产生错误
错误语法。