2016-11-03 9 views
0

У меня есть следующая таблица.Найти ближайшую совпадающую строку в sql-сервере

TableName: Mask 

Columns: 

MaskId INT 
MaskCode VARCHAR(100) 

Если я прохожу ввода в MasKid = 1, то я получаю две записи с разными maskcodes.

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,'*',''+'%' 

Просьба представить любые идеи.

ответ

0

Я думаю, что вы хотите использовать 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 шаблоны семантики.

+0

Я не могу использовать верх, так как в некоторых случаях мне нужно несколько строк , Я обновил свой вопрос. Проверьте, как достичь сценария-3, а также – StackUser

+0

@StackUser. , , Конечно вы можете. Просто используйте 'TOP (1) WITH TIES'. –

0
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