我有下表。
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****
请提供任何想法。
答案 0 :(得分: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
模式语义。
答案 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