2017-02-23 7 views
0

Ich habe eine Spalte, die einen vollständigen Namen in einer Zeichenfolge zurückschreibt: "Mr. John Smith".T-SQL - Name aus einer Spalte von Daten extrahieren

Wie extrahiere ich nur den Nachnamen?

Mein Spaltenname ist "Contact_Name".

Die Datenquelle enthält Tausende von Namen, einige haben einen Bindestrich. Es wird immer ein Leerzeichen zwischen dem ersten und zweiten Namen sein.

Dank

+1

Dies ist notorisch schwieriges Problem, da die Anzahl von verschiedenen Möglichkeiten, ungezwungene Benutzer Einzelpersonen Namen eingeben können, ist nahezu unbegrenzt. Bessere Lösung: Trennen Sie firstName, Präfix, middleName, Nachname, Titel, Suffix usw. in separate Felder und bereinigen Sie dann Ihre Daten während der Migration auf ein neues Schema. –

+0

Stimmen Sie mit Charles überein, wie gehen Sie mit Menschen um, die doppel- oder einfach nur mehrteilige Nachnamen haben? Können Sie 100% garantieren, dass Ihre Daten * immer * einen Nachnamen haben? – iamdave

+0

Ist der Nachname immer der letzte (nach dem letzten Leerzeichen)? – vitalygolub

Antwort

0

Dies wird alle möglichen Namen nicht fangen, aber das tun, was Sie in Ihrer Frage fragen:

declare @Contact_Name nvarchar(100) = 'Mr John Smith'; 

select reverse(left(reverse(@Contact_Name) 
        ,charindex(' ',reverse(@Contact_Name),1)-1 
        ) 
      ) as Surname; 

Returns:

Surname 
``````` 
Smith 
0

Wenn Ihr Contact_Name Raum enthalten jedes Mal, dies sollten Sie eine relativ gute Lösung geben.

SELECT REVERSE('ad bbb cvb'), 
CHARINDEX(' ', REVERSE('ad bbb cvb')), 
LEN('ad bbbb cvb'),   
SUBSTRING('ad bbb cvb', 
      LEN('ad bbb cvb')-CHARINDEX(' ', REVERSE('ad bbb cvb'))+2, 
      LEN('ad bbb cvb')) 
+0

Haben Sie das getestet? Es gibt "h" für den "Contact_Name" von "Mr. John Smith" zurück – iamdave

0

Wow, einige dieser Antworten sind super kompliziert ... Hier ist eine vereinfachte Version:

DECLARE @NAMES TABLE (Name VARCHAR(55)); 
INSERT INTO @NAMES VALUES ('Mr. John Smith'); 
INSERT INTO @NAMES VALUES ('Mrs. Jane Smith'); 
INSERT INTO @NAMES VALUES ('Mr. John Doe'); 
INSERT INTO @NAMES VALUES ('Mr. Englebert Humperdink'); 
INSERT INTO @NAMES VALUES ('Ms. Maybe Happy-NotSoMuch'); 
INSERT INTO @NAMES VALUES ('Mr. Lovely Taco'); 

SELECT RIGHT(Name,CHARINDEX(' ',REVERSE(Name)) - 1) 
FROM @NAMES 
; 

Returns:

Name 
----- 
Smith 
Smith 
Doe 
Humperdink 
Happy-NotSoMuch 
Taco 
Verwandte Themen