在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】:

我想你想使用TOPLENLIKE

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中查找最接近的匹配行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中查找最具体的匹配行

在数组中查找匹配或最接近的值

python:在大整数列表中查找小整数列表的最接近匹配

在 DB2 sql 中获取最接近的匹配值

SQL中最接近的部分字符串匹配

基于 SQL 查询中最接近的文本匹配连接表?