在sql server中查找最接近的匹配行
Posted
技术标签:
【中文标题】在sql server中查找最接近的匹配行【英文标题】:Find the closest matching row in sql server 【发布时间】:2016-11-03 14:29:32 【问题描述】:我有下表。
TableName: Mask
Columns:
MaskId INT
MaskCode VARCHAR(100)
如果我将 Input 作为 MaskId=1 传递,那么我得到 两条不同掩码的记录。
select maskcode from mask where maskid=1
G******
G12****
我想在这两行中找到最接近的匹配行。我再介绍一个 输入@Maskcode
场景一:
现在我要传递两个输入
MaskId=1, maskcode=G123456
我的查询会是这样的
select maskcode from mask where maskid=1 and maskcode='G123456'
在这种情况下,我需要 G12**** 行,因为这是两行中最接近的匹配。
场景 2:
MaskId=1, maskcode=G999999
在这种情况下,我需要 G***** 行。
场景 3:
对于 MaskId=2,我在下面有两条记录
6h****
6h****
我对这种情况的输入是 Maskid=2 和 Maskcode=6h1234 在这种情况下,我需要两行,因为我们无法在这两行中找到最接近的。
我尝试了以下,但它返回两行。
select *From mask
where @Maskcode
like '%'+replace(MaskCode,'*',''+'%'
请提供任何想法。
【问题讨论】:
我知道这是一个老问题,但如果下面的答案对你有用,我会接受其中一个:) 【参考方案1】:我想你想使用TOP
和LEN
和LIKE
:
select top 1 m.*
from mask
where @Maskcode like '%' + replace(MaskCode, '*', '') + '%'
order by len(replace(MaskCode, '*', '')) desc;
顺便问一下,你真的想要开头的通配符吗?或者您可能想要:
where @Maskcode like replace(MaskCode, '*', '%')
%
多次出现并排不会影响LIKE
模式语义。
【讨论】:
我不能使用 top 因为在某些情况下我需要多行。我更新了我的问题。请检查如何实现场景 3 以及 @StackUser 。 . .当然可以。只需使用TOP (1) WITH TIES
。【参考方案2】:
Declare @MaskCode varchar(25) = '6h1234'
Select *
From (
Select *,Rnk = Dense_Rank() over (Order By Len(Replace(MaskCode,'*','')) Desc)
From MaskCode
Where @MaskCode Like Replace(MaskCode,'*','')+'%'
) A
Where Rnk=1
使用@MaskCode = '6h1234' 返回
MaskID MaskCode Rnk
2 6h**** 1
2 6h**** 1
使用@MaskCode = 'G123456' 返回
MaskID MaskCode Rnk
1 G12**** 1
【讨论】:
以上是关于在sql server中查找最接近的匹配行的主要内容,如果未能解决你的问题,请参考以下文章