在sql server中找到最接近的匹配行

时间:2016-11-03 14:29:33

标签: sql sql-server sql-server-2008 sql-server-2005

我有下表。

app.use(require('body-parser').json());

如果我将Input作为MaskId = 1传递,那么我正在接受 两个具有不同掩码的记录。

TableName: Mask

Columns:

MaskId INT
MaskCode VARCHAR(100)

我想在这两行中找到最接近的匹配行。我将再介绍一个 输入@Maskcode

情境-1:

现在我将传递两个输入

select maskcode from mask where maskid=1

G******
G12****

我的查询将是这样的

MaskId=1, maskcode=G123456 

在这种情况下,我需要G12 ****行,因为这是两行中最接近的匹配。

情境-2:

select maskcode from mask where maskid=1 and maskcode='G123456'

在这种情况下,我需要G *****行。

情境-3:

对于MaskId = 2,我有两条记录

MaskId=1, maskcode=G999999

我对这种情况的输入是Maskid = 2和Maskcode = 6h1234 在这种情况下我需要两行,因为我们找不到这两行中最接近的行。

我尝试了以下但它返回了两行。

6h****
6h****

请提供任何想法。

2 个答案:

答案 0 :(得分:1)

我认为你想使用TOPLEN以及LIKE

select top 1 m.*
from mask
where @Maskcode like '%' + replace(MaskCode, '*', '') + '%'
order by len(replace(MaskCode, '*', '')) desc;

顺便问一下,你真的想要一开始的通配符吗?或许你想要:

where @Maskcode like replace(MaskCode, '*', '%')

多次出现%彼此相邻不会影响LIKE模式语义。

答案 1 :(得分:1)

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