Найти SOUNDEX каждого слова в столбце - PullRequest
0 голосов
/ 16 марта 2019

У меня есть следующие данные:

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');

Примечание. Я хочу найти значение soundex для каждого слова в поле имени, кроме английского Honorifics (Mr, Ms и т. Д.).

ОжидаетсяРезультат:

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 Ответ

1 голос
/ 16 марта 2019

Вам нужно разделить имена (имена) на их части и «объединить» их. В SQL Server 2008 (который почти полностью не поддерживается, поэтому вам следует обратить внимание на свои планы обновления) нет встроенного разделителя. Однако в SQL Server 2016+ он не содержит порядкового номера; поэтому я использовал DelimitedSplit8K (Google найдет это). Если вы используете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...