在该列中找到每个单词的SOUNDEX

时间:2019-03-16 09:22:16

标签: sql-server sql-server-2008-r2 soundex

我有以下数据:

create table testing
(
name varchar(100)
);

insert into testing values('Mr.Alex James Henrry');
insert into testing values('Mr John Desto');
insert into testing values('Ms.Lisa Jack Jerry Han');
insert into testing values('Smith White');
insert into testing values('Rowny James Duest');

注意:我想在名称字段中查找每个单词的音色值,但英文敬拜者(先生,女士等)除外。

预期结果:

name                    name_soundex
-------------------------------------
Mr.Alex James Henrry    A420 J520 H560
Mr John Desto           J500 D230
Ms.Lisa Jack Jerry Han  L200 J200 J600 H500
Smith White             S530 W300
Rowny James Duest       R500 J520 D230

尝试:

添加列以存储soundex:

alter table testing
add name_soundex varchar(500);

更新:

update testing
set name_soundex = SOUNDEX(name)

获得以下输出:

name                    name_soundex
-------------------------------------
Mr.Alex James Henrry    M600
Mr John Desto           M600
Ms.Lisa Jack Jerry Han  M200
Smith White             S530
Rowny James Duest       R500

1 个答案:

答案 0 :(得分:1)

您需要将名称分成各自的部分,然后“重新合并”它们。 SQL Server 2008(几乎完全不受支持,因此您应该查看升级计划)没有内置的拆分器。但是,SQL Server 2016+却没有按序排列。因此,我用过DelimitedSplit8K(谷歌会找到这个)。如果您使用的是2012+版本,我建议您使用DelimitedSplit8K_LEAD(即使在2016+版本也是如此,因为顺序位置很重要):

WITH VTE AS(
    SELECT *
    FROM (VALUES('Mr.Alex James Henrry'),
                ('Mr John Desto'),
                ('Ms.Lisa Jack Jerry Han'),
                ('Smith White'),
                ('Rowny James Duest')) V([Name]))
SELECT [name],
       STUFF((SELECT ' ' + SOUNDEX(DS.item)
              FROM dbo.DelimitedSplit8K(REPLACE([name],'.',' '),' ') DS
              WHERE DS.item NOT IN ('Mr','Mrs','Miss','...') --You know what your acceptable titles are
                                                             --Although, seeing as you have both "Mr {name}" and Mr.{name}", maybe not :/
              ORDER BY DS.itemnumber
              FOR XML PATH('')),1,1,'') AS name_soundex
FROM VTE;