2011-05-12 3 views
1

J'ai un champ de nom qui inclut des suffixes, et je dois diviser le champ en un champ de nom et un champ de suffixe. J'ai essayé charindex, mais j'ai du mal avec la syntaxe. Des échantillons des données sont les suivantes:Nom de famille et suffixe divisés dans le champ

Miller 
Wilson Jr 
Hearne Sr 
Horner III 
Bond jr 
Jones-Alexander 
Brown ii 
Rodriguez Maldonado 
Appleby 

Je suis en train de trouver une instruction select fiable dans SQL Server pour tirer ces données dans une autre table avec le nom et le suffixe séparés.

Nous vous remercions de votre aide.

Modifier Informations additionnelles publié en réponse

S'il n'y a pas de suffixe, je voudrais obtenir le nom dans un champ LastName, et laisser le suffixe comme nul.

Heureusement, il n'y a pas de prénoms ou titres dans ce domaine, je ne vais pas à vous soucier de ceux-ci, seulement les II, III, IV, Jr, Sr, deux parties dernières noms,

+1

Que devrait-il se passer s'il n'y a pas de suffixe? – Femi

+0

Message similaire: http://stackoverflow.com/questions/630907/mssql-split-a-field-into-3-fields – garnertb

+0

Les noms sont d'une complexité néfaste dans la nature, car il existe environ 1000 façons dont le nom d'une personne pourrait exister. Voici un blog dessus http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/parsing-fullname-field-to-individual – DForck42

Répondre

2

Vous devriez pouvoir utiliser une instruction CASE qui vérifie l'existence du nom que vous voyez dans vos données.

CASE WHEN POSITION(' Jr' IN LastName) > 0 
    THEN SUBSTRING(LastName FROM POSITION(' Jr' IN LastName) FOR 2) 
    WHEN POSITION(' III' IN LastName) > 0 
    .... 
END 

Il ne va certainement pas tout attraper et vous devrez peut-être constamment le modifier. Votre autre option serait d'introduire un outil de qualité des données qui peut analyser les données de noms en utilisant des listes connues de prénoms et de noms de famille associés à des suffixes et des titres. N'oubliez pas que vous pouvez rencontrer John M. Smith III, MD. Comment allez-vous gérer cela?

0

Nous vous remercions de votre aide. J'ai fini par utiliser une déclaration de cas pour obtenir ce dont j'avais besoin. Cela semble un peu grossier, mais on dirait qu'il est fiable pour ce dont j'ai besoin:

CASE 
    WHEN (mytable.L_NAME like '% Jr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% Sr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% II') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% III') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% IV') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% V') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% VI') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    ELSE mytable.L_NAME 
END 
AS LastName, 

CASE 
    WHEN (mytable.L_NAME like '% Jr') Then 'Jr' 
    WHEN (mytable.L_NAME like '% Sr') Then 'Sr' 
    WHEN (mytable.L_NAME like '% II') Then 'II' 
    WHEN (mytable.L_NAME like '% III') Then 'III' 
    WHEN (mytable.L_NAME like '% IV') Then 'IV' 
    WHEN (mytable.L_NAME like '% V') Then 'V' 
    WHEN (mytable.L_NAME like '% VI') Then 'VI' 
    ELSE NULL 
END 
AS Suffix, 
+0

Cela ne fonctionnera pas s'il y a un espace dans le nom de famille AVANT le suffixe. Exemple: "Smith Jones V" Correspond à "% V", donc votre code recherche le premier espace et retourne "Smith" - le "Jones" est perdu pour toujours. Si vous cherchez "V" au lieu d'un simple espace, vous êtes plus proche ... Mais avec les données "Smith Vincent V" vous perdrez toujours le "Vincent". Au lieu de cela, utilisez 'SUBSTRING (mytable.L_Name, 1, Len (mytable.L_Name) -2)' - au lieu de 2, utilisez 1 de plus que la longueur du suffixe (2 pour V, 3 pour II et IV et JR, 4 pour III, et ainsi de suite). –

Questions connexes