Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Extrahieren Sie Nachname, Vorname und Suffix in separate Spalten

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 Teil AfterComma
  • 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 und Suffix .

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