在sql server中查找最接近的匹配行
我有下表在sql server中查找最接近的匹配行,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我有下表 TableName: Mask Columns: MaskId INT MaskCode VARCHAR(100) 如果我以MaskId=1的形式传递输入,那么我得到 两个具有不同马斯克代码的记录 select maskcode from mask where maskid=1 G****** G12**** 我想在这两行中找到最接近的匹配行。我再介绍一个 输入@Maskcode 情景1: 现在我要传递两个输入 MaskId=1, maskcode=G123456 我的问
TableName: Mask
Columns:
MaskId INT
MaskCode VARCHAR(100)
如果我以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****行,因为这是两行中最接近的匹配
select *From mask
where @Maskcode
like '%'+replace(MaskCode,'*',''+'%'
情景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
和之类的:
select top 1 m.*
from mask
where @Maskcode like '%' + replace(MaskCode, '*', '') + '%'
order by len(replace(MaskCode, '*', '')) desc;
顺便问一下,你真的想在开头使用通配符吗?或者你想:
where @Maskcode like replace(MaskCode, '*', '%')
多个相邻出现的%
不会影响LIKE
模式语义。我认为您应该使用TOP
和LEN
和LIKE
:
select top 1 m.*
from mask
where @Maskcode like '%' + replace(MaskCode, '*', '') + '%'
order by len(replace(MaskCode, '*', '')) desc;
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
顺便问一下,你真的想在开头使用通配符吗?或者你想:
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
使用@MaskCode='6h1234'返回
MaskID MaskCode Rnk
2 6h**** 1
2 6h**** 1
使用@MaskCode='G123456'返回
MaskID MaskCode Rnk
1 G12**** 1
我不能使用top,因为在某些情况下我需要多行。我更新了我的问题。请检查如何实现场景3,如图所示well@StackUser . . . 你当然可以。只需使用带领带的TOP(1)
。我不能使用TOP,因为在某些情况下,我需要多行。我更新了我的问题。请检查如何实现场景3,如图所示well@StackUser . . . 你当然可以。我知道这是个老问题,但如果下面的答案对你有用,我会接受其中一个:)我知道这是个老问题,但如果下面的答案对你有用,我会接受其中一个:)