Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中查找最接近的匹配行_Sql_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

在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 . . . 你当然可以。我知道这是个老问题,但如果下面的答案对你有用,我会接受其中一个:)我知道这是个老问题,但如果下面的答案对你有用,我会接受其中一个:)