[英]Find the closest matching row in sql server
我有下表。
TableName: Mask
Columns:
MaskId INT
MaskCode VARCHAR(100)
如果我將Input作為MaskId = 1傳遞,那么我將獲得兩條具有不同掩碼代碼的記錄。
select maskcode from mask where maskid=1
G******
G12****
我想在這兩行中找到最接近的匹配行。 我將再介紹一個輸入@Maskcode
方案1:
現在我要傳遞兩個輸入
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,'*',''+'%'
請提供任何想法。
我認為您想使用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
模式的語義。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.