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 partieAfterComma
- 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
etSuffix
.
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