Sie sollten diese Teile des Namens unbedingt in separaten Spalten (erste Normalform) speichern, um ein solches Parsen zu vermeiden.
Sie können die gesamte Logik in einen riesigen Aufruf verschachtelter Funktionen packen, aber es ist ziemlich praktisch, sie mit CROSS APPLY
in einzelne Aufrufe aufzuteilen .
Das Parsen ist einfach:
- Position des Kommas finden
- Teilen Sie die Zeichenfolge in einen Teil vor dem Komma auf (
LastName
) und TeilAfterComma
- Finde Position des ersten Leerzeichens im zweiten Teil
AfterComma
- Split den String wieder in zwei Teile - das ergibt
FirstName
und der Rest (AfterSpace
) - Position des Leerzeichens in
AfterSpace
finden - Split den String wieder in zwei Teile - das ergibt
Initial
undSuffix
.
Die Abfrage prüft auch Ergebnisse von CHARINDEX
- Es wird 0 zurückgegeben, wenn die Zeichenfolge nicht gefunden wird.
Wenn der Zeichenfolgenwert nicht im erwarteten Format vorliegt, erhalten Sie natürlich ein falsches Ergebnis.
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
Ergebnis
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