簡體   English   中英

在SQL Server中找到最接近的匹配行

[英]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以及LENLIKE

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM