我有一个包含字符串的列表,让我们说nvarchar
。现在,用户将字符串传递给在其指定列中搜索此字符串的函数。我想检查数据库中是否存在该字符串,但问题是它不一定必须是100%匹配。
比方说,举个例子:
用户传递了字符串Johnathon
,并且此数据库中存在字符串John
。
所以,基本上我想得到匹配的字符数。在John
和Johnathon
的特殊情况下。应该是4匹配,5匹配。
我可以请一些方法来解决这个问题吗?
编辑:我猜测的是,一旦我从列中检索到最匹配的字符串,我就可以进行百分比匹配。因此,同样地,如果我们忽略匹配和不匹配字符的数量并专注于从数据库中检索匹配的字符串,那应该可行。
例如,当用户传递Johnathon
并且数据库中存在John
时,我绝对不能在这里使用Like
运算符,而是一段搜索列中匹配最多的字符串并返回它。
答案 0 :(得分:1)
@DeadlyJesus提到的Levenshtein距离可能适合你,但另一种选择就是从2个弦的开头算起匹配的特征。一个简单的用户定义函数可以做到这一点。
create function dbo.MatchStart(@input1 nvarchar(100), @input2 nvarchar(100)) returns int as
begin
declare @i int
set @i = 1
if (@input1 is not null and @input2 is not null)
begin
while (1 = 1)
begin
if (@i > len(@input1) or @i > len(@input2))
break
if (substring(@input1, @i, 1) <> substring(@input2, @i, 1))
break;
set @i = @i + 1
end
end
return @i - 1
end
go
declare @testTable table (text1 nvarchar(100))
declare @userInput nvarchar(100)
insert @testTable values
(null),
(''),
('John'),
('Johnathan'),
('JohXXX'),
('Fred'),
('JxOxHxN')
set @userInput = 'Johnathan'
select text1, dbo.MatchStart(text1, @userInput) as result from @testTable
答案 1 :(得分:1)
你可以这样做:
SELECT Name, LEN(Name) AS Equals, (LEN('Johnathon') - LEN(Name)) AS NotEquals
FROM TableName
WHERE 'Johnathon' LIKE '%' +Name +'%'
或者如果你想比较两种方式:
DECLARE @parameter NVARCHAR(MAX) = N'Johnathon'
SELECT Name,
CASE WHEN LEN(Name) > LEN(@parameter) THEN LEN(@parameter) ELSE LEN(Name) END AS Equals,
CASE WHEN LEN(Name) > LEN(@parameter) THEN LEN(Name) - LEN(@parameter) ELSE LEN(@parameter) - LEN(Name) END AS NotEquals
FROM TableName
WHERE Name LIKE '%' + @parameter + '%' OR @parameter LIKE '%' +Name +'%'
答案 2 :(得分:0)
您可以尝试这种方法: -
IF EXISTS(SELECT * FROM TAB_NAME WHERE COL LIKE '%JOHN%')
SELECT LEN('JOHN') AS MATCHED, (LEN(COL) - LEN('JOHN')) AS UNMATCHED
FROM TAB_NAME;
我认为这种方法可以解决您的问题。