U moet deze delen van de naam echt in aparte kolommen (eerste normaalvorm) opslaan om dergelijke ontleding te voorkomen.
Je kunt alle logica in één grote aanroep van geneste functies stoppen, maar het is best handig om ze te scheiden in afzonderlijke aanroepen met CROSS APPLY
.
Het ontleden is eenvoudig:
- vind positie van komma
- splits de tekenreeks in delen vóór de komma (
LastName
) en deelAfterComma
- vind de positie van de eerste spatie in het tweede deel
AfterComma
- split de string opnieuw in twee delen - dit geeft
FirstName
en de rest (AfterSpace
) - vind de positie van de spatie in
AfterSpace
- split de string opnieuw in twee delen - dit geeft
Initial
enSuffix
.
De zoekopdracht controleert ook de resultaten van CHARINDEX
- het geeft 0 terug als de string niet wordt gevonden.
Het is duidelijk dat als de tekenreekswaarde niet in het verwachte formaat is, je een onjuist resultaat krijgt.
DECLARE @T TABLE (Name varchar(8000));
INSERT INTO @T (Name) VALUES
('Walker'),
('Walker,James M JR'),
('Smith,Jack P'),
('Smith,Whitney');
SELECT
Name
,LastName
,AfterComma
,FirstName
,AfterSpace
,MidInitial
,Suffix
FROM
@T
CROSS APPLY (SELECT CHARINDEX(',', Name) AS CommaPosition) AS CA_CP
CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN
LEFT(Name, CommaPosition - 1) ELSE Name END AS LastName) AS CA_LN
CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN
SUBSTRING(Name, CommaPosition + 1, 8000) ELSE '' END AS AfterComma) AS CA_AC
CROSS APPLY (SELECT CHARINDEX(' ', AfterComma) AS SpacePosition) AS CA_SP
CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN
LEFT(AfterComma, SpacePosition - 1) ELSE AfterComma END AS FirstName) AS CA_FN
CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN
SUBSTRING(AfterComma, SpacePosition + 1, 8000) ELSE '' END AS AfterSpace) AS CA_AS
CROSS APPLY (SELECT CHARINDEX(' ', AfterSpace) AS Space2Position) AS CA_S2P
CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN
LEFT(AfterSpace, Space2Position - 1) ELSE AfterSpace END AS MidInitial) AS CA_MI
CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN
SUBSTRING(AfterSpace, Space2Position + 1, 8000) ELSE '' END AS Suffix) AS CA_S
resultaat
Name LastName AfterComma FirstName AfterSpace MidInitial Suffix
Walker Walker
Walker,James M JR Walker James M JR James M JR M JR
Smith,Jack P Smith Jack P Jack P P
Smith,Whitney Smith Whitney Whitney