Sql server SQL server排序包含结果
我想在SQLServer中编写一个查询,在某些列中搜索一些单词,并用匹配的单词数对结果进行排序。例如,在打击中,结果的顺序必须为:第2行、第3行、第1行 搜索字符串: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中选择
w1 w2 w3
行1:column1=w1w4
column2=w5w6
=>匹配字:w1
第2行:column1=
w1w2
column2=w3w4
=>匹配词:w1
w2w3
第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”附近产生错误错误语法。