用 soundex 检查字符串中的搜索词到列值
Search words in the string to column value with soundex check
我有以下示例数据:
create table tbl_test
(
name varchar(50)
);
insert into tbl_test values('Frapples Bob'),('A Molive Paul'),('James Make'),('Mak Lee'),('James Harry');
注:实际table有1亿多条记录
在这里我想搜索如下所示的名称:
搜索姓名:Mak Jams
预期结果:如果两个关键字都出现在名称字段中并进行 soundex 检查,则应该显示结果。
name
-------
James Make
我的尝试 1:
declare @str varchar(100) = 'Mak Jams'
declare @where varchar(max) = ''
declare @query varchar(max) = ''
select @where = replace(STUFF((SELECT 'CHARINDEX('''+ item +''',name) > 0 AND '
from dbo.f_split(@str,'')
FOR XML PATH('')
), 1, 0, ''),'>','>')
set @where = substring(@where,1,(len(@where) - 3))
print(@where);
set @query = 'select name
from tbl_test
where '+@where+'';
print(@query);
exec(@query);
输出:无法达到预期结果。
尝试 2:我尝试为两侧(值和列)添加 soundex,但 soundex 仅适用于字符串中的第一个关键字。
select name
from tbl_test
where CHARINDEX(soundex('Mak'),soundex(name)) > 0 AND CHARINDEX(soundex('Jams'),soundex(name)) > 0
输出:无法达到预期结果。
您可以通过以下查询获得预期结果
select * from (
select
name,
Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 1)) As [M1]
, Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 2)) As [M2]
, Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 3)) As [M3]
,SOUNDEX('mak') mak,SOUNDEX('jams') jams,
SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 1)) )As [M11]
,SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 2))) As [M21]
, SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 3)))m31
from tbl_test )a
where (mak=[M11] or mak=[m21] or mak=[M31]) and (jams=[M11] or jams=[m21] or
jams=[M31])
只需将它们的 soundex 值与搜索关键字 soundex.You 进行比较,就必须拆分字符串 1。参数字符串和 table 列字符串以获得预期输出。
我有以下示例数据:
create table tbl_test
(
name varchar(50)
);
insert into tbl_test values('Frapples Bob'),('A Molive Paul'),('James Make'),('Mak Lee'),('James Harry');
注:实际table有1亿多条记录
在这里我想搜索如下所示的名称:
搜索姓名:Mak Jams
预期结果:如果两个关键字都出现在名称字段中并进行 soundex 检查,则应该显示结果。
name
-------
James Make
我的尝试 1:
declare @str varchar(100) = 'Mak Jams'
declare @where varchar(max) = ''
declare @query varchar(max) = ''
select @where = replace(STUFF((SELECT 'CHARINDEX('''+ item +''',name) > 0 AND '
from dbo.f_split(@str,'')
FOR XML PATH('')
), 1, 0, ''),'>','>')
set @where = substring(@where,1,(len(@where) - 3))
print(@where);
set @query = 'select name
from tbl_test
where '+@where+'';
print(@query);
exec(@query);
输出:无法达到预期结果。
尝试 2:我尝试为两侧(值和列)添加 soundex,但 soundex 仅适用于字符串中的第一个关键字。
select name
from tbl_test
where CHARINDEX(soundex('Mak'),soundex(name)) > 0 AND CHARINDEX(soundex('Jams'),soundex(name)) > 0
输出:无法达到预期结果。
您可以通过以下查询获得预期结果
select * from (
select
name,
Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 1)) As [M1]
, Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 2)) As [M2]
, Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 3)) As [M3]
,SOUNDEX('mak') mak,SOUNDEX('jams') jams,
SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 1)) )As [M11]
,SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 2))) As [M21]
, SOUNDEX( Reverse(ParseName(Replace(Reverse(name), ' ', '.'), 3)))m31
from tbl_test )a
where (mak=[M11] or mak=[m21] or mak=[M31]) and (jams=[M11] or jams=[m21] or
jams=[M31])
只需将它们的 soundex 值与搜索关键字 soundex.You 进行比较,就必须拆分字符串 1。参数字符串和 table 列字符串以获得预期输出。