Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Extraire le nom, le prénom et le suffixe dans des colonnes séparées

Vous devriez vraiment stocker ces parties du nom dans des colonnes séparées (première forme normale) pour éviter une telle analyse.

Vous pouvez mettre toute la logique dans un énorme appel de fonctions imbriquées, mais il est assez pratique de les séparer en appels uniques en utilisant CROSS APPLY .

L'analyse est simple :

  • trouver la position de la virgule
  • divisez la chaîne en une partie avant la virgule (LastName ) et la partie AfterComma
  • trouver la position du premier espace dans la deuxième partie AfterComma
  • divisez à nouveau la chaîne en deux parties - cela donne FirstName et le reste (AfterSpace )
  • trouver la position de l'espace dans AfterSpace
  • divisez à nouveau la chaîne en deux parties - cela donne Initial et Suffix .

La requête vérifie également les résultats de CHARINDEX - il renvoie 0 si la chaîne n'est pas trouvée.

Évidemment, si la valeur de la chaîne n'est pas au format attendu, vous obtiendrez un résultat incorrect.

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

résultat

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