2012-06-06 7 views
32

Ich habe eine Spalte, die Vorname und Nachname zusammen hat. Ich schreibe einen Bericht, um den Vor- und Nachnamen zu trennen. Wie bekomme ich den Vornamen und den Nachnamen in T-SQL getrennt?T-SQL-Teilzeichenfolge - Trennen von Vor- und Nachname

+4

Können Sie ein Beispiel für Daten zeigen? – raym0nd

+10

Gibt es immer einen Platz? Was passiert mit "Prinz", "Alf" oder "Madonna"? Wie wäre es mit 'Philip Seymour Hoffman' oder' James van der Beek'? –

+6

Wirklich, das ist eine ** sehr ** schwierige Aufgabe. Um es richtig zu machen, brauchst du ein Namen-Wörterbuch oder etwas, um deine Eingabe zu vergleichen und dann zu entscheiden, wie man sie trennt. Es ist eine wirklich komplexe Sache zu tun – Lamak

Antwort

2

Sie können dies tun, wenn Vorname und Nachname durch Leerzeichen getrennt sind:

SELECT SUBSTRING(FirstAndSurnameCol, 0, CHARINDEX(' ', FirstAndSurnameCol)) Firstname, 
SUBSTRING(FirstAndSurnameCol, CHARINDEX(' ', FirstAndSurnameCol)-1, LEN(FirstAndSurnameCol)) Surname FROM ... 
+0

SUBSTRING (FirstAndSurnameCol, CHARINDEX ('', FirstAndSurnameCol) +1, LEN (FirstAndSurnameCol)) –

12

Dies sollte funktionieren:

Select 
    LTRIM(RTRIM(SUBSTRING(FullName, 0, CHARINDEX(' ', FullName)))) As FirstName 
, LTRIM(RTRIM(SUBSTRING(FullName, CHARINDEX(' ', FullName)+1, 8000)))As LastName 
FROM TABLE 

bearbeiten: Angenommen Aaron und Jonnys Hinweis mit der festen Länge von 8000 um unnötige Berechnungen zu vermeiden.

+0

... und es tut! –

+0

Wenn im ursprünglichen Namen kein Leerzeichen enthalten ist, führt dies dazu, dass der Vorname leer ist und der Nachname der Wert ist. – Evan

44

die FirstName Unter der Annahme, alle Zeichen bis zum ersten Platz:

SELECT 
    SUBSTRING(username, 1, CHARINDEX(' ', username) - 1) AS FirstName, 
    SUBSTRING(username, CHARINDEX(' ', username) + 1, 8000) AS LastName 
FROM 
    whereever 
+1

Warum verwenden Sie einen Punkt? – libjup

+1

und vielleicht möchten Sie LEN (Benutzername) anstatt nur 8000 – libjup

+19

@libjup verwenden, gibt es eigentlich ziemlich guten Grund, einen festen Wert zu verwenden, der höher ist als jede mögliche Länge. Warum sollten Sie die Länge jeder einzelnen Zeile berechnen? Vergeudete Zyklen. –

6
validate last name is blank 

SELECT 
person.fullName, 
(CASE WHEN 0 = CHARINDEX(' ', person.fullName) 
    then person.fullName 
    ELSE SUBSTRING(person.fullName, 1, CHARINDEX(' ', person.fullName)) end) as first_name, 
(CASE WHEN 0 = CHARINDEX(' ', person.fullName) 
    THEN '' 
    ELSE SUBSTRING(person.fullName,CHARINDEX(' ', person.fullName), LEN(person.fullName))end) last_name 

FROM person 
5

Diese Pflege von Namen wie "Vorname Nachname Z." nehmen und "First Z Last"

SELECT 
CASE 
    WHEN CHARINDEX(' ',name) = 0 THEN name 
    WHEN CHARINDEX(' ',name) = PATINDEX('% _[., ]%',name) THEN RTRIM(SUBSTRING(name, 1, CHARINDEX(' ',name) + 2)) 
    ELSE SUBSTRING(name,1, CHARINDEX(' ',name)) 
END [firstname] 
,CASE 
    WHEN CHARINDEX(' ',name) = 0 THEN '' 
    WHEN CHARINDEX(' ',name) = PATINDEX('% _[., ]%',name) THEN LTRIM(SUBSTRING(name, CHARINDEX(' ',name) + 3,1000)) 
    ELSE SUBSTRING(name,CHARINDEX(' ',name)+1,1000) 
END [lastname] 
FROM [myTable] 
15

Der einfachste Weg, den ich finden kann, es zu tun ist:

SELECT 
    SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) AS FirstName, 
    REVERSE(SUBSTRING(REVERSE(FullName), 1, CHARINDEX(' ', REVERSE(FullName)) - 1)) AS LastName 
FROM 
    [PERSON_TABLE] 
Hier
+1

Ich bevorzuge diese Lösung, da es den zweiten Vornamen aus dem vollständigen Namen entfernt –

+1

Das ist meine Lieblingsantwort auch. Wenn Sie möchten, dass Ihr Vorname auch den zweiten Vornamen enthält (wenn Sie berücksichtigen, dass der Nachname ein einzelnes Nomen ist), können Sie Folgendes tun: 'REPLACE (FullName, REVERSE (SUBSTRING (REVERSE (FullName) , 1, CHARINDEX ('', REVERSE (FullName)) - 1)), '') AS Vorname – TheWanderingMind

3

ist eine aufwendigere Lösung mit einer SQL-Funktion:

getFirstName

CREATE FUNCTION [dbo].[ufn_GetFirstName] 
( 
@FullName varchar(500) 
) 
RETURNS varchar(500) 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @RetName varchar(500) 

SET @FullName = replace(replace(replace(replace(@FullName, '.', ''), 'Mrs', ''), 'Ms', ''), 'Mr', '') 

SELECT 
    @RetName = 
    CASE WHEN charindex(' ', ltrim(rtrim(@FullName))) > 0 THEN left(ltrim(rtrim(@FullName)), charindex(' ', ltrim(rtrim(@FullName ))) - 1) ELSE '' END 

RETURN @RetName 
END 

GetLastName

CREATE FUNCTION [dbo].[ufn_GetLastName] 
( 
@FullName varchar(500) 
) 
RETURNS varchar(500) 
AS 
BEGIN 
DECLARE @RetName varchar(500) 

IF(right(ltrim(rtrim(@FullName)), 2) <> ' I') 
BEGIN 
    set @RetName = left( 
    CASE WHEN 
    charindex(' ', reverse(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    )))) > 0 
    THEN 
    right(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    )) , charindex(' ', reverse(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    ))) ) - 1) 
    ELSE '' END 
    , 25) 
END 
ELSE 
BEGIN 
    SET @RetName = left( 
    CASE WHEN 
    charindex(' ', reverse(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' I', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    )))) > 0 
    THEN 
    right(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' I', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    )) , charindex(' ', reverse(ltrim(rtrim( 
    replace(replace(replace(replace(replace(replace(replace(@FullName, ' Jr', ''), ' III', ''), ' II', ''), ' I', ''), ' Jr.', ''), ' Sr', ''), 'Sr.', '') 
    ))) ) - 1) 
    ELSE '' END 
    , 25) 
END 

RETURN @RetName 
END 

ANWENDUNG:

SELECT dbo.ufn_GetFirstName(Fullname) as FirstName, dbo.ufn_GetLastName(Fullname) as LastName FROM #Names 
2

Möglicherweise haben Sie Probleme, wenn die Vollständiger Name enthält kein Leerzeichen. die ganze Fullname Unter der Annahme, geht es Familienname, wenn kein Platz ist und Vorname wird ein leerer String, dann können Sie diese verwenden:

SELECT 
    RTRIM(LEFT(FullName, CHARINDEX(' ', FullName))) AS FirstName, 
    SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, 8000) AS LastName 
FROM 
    MyNameTable; 
1

Der Code funktioniert unten mit Nachname, Vorname M Name-Strings. Ersetzen Sie "Name" durch Ihren Namen String Spaltenname. Da Sie eine Periode als letztes Zeichen haben, wenn es eine mittlere Initiale gibt, würden Sie die 2en durch 3en in jeder der Zeilen (2, 6 und 8) ersetzen - und "RECHTS (Name, 1)" in "RECHTS" ändern (Name, 2)“in Zeile 8.

SELECT SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1) LastName , 
CASE WHEN LEFT(RIGHT(Name, 2), 1) <> ' ' 
    THEN LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)) 
    ELSE LEFT(LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)), 
       LEN(LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99))) 
       - 2) 
END FirstName , 
CASE WHEN LEFT(RIGHT(Name, 2), 1) = ' ' THEN RIGHT(Name, 1) 
    ELSE NULL 
END MiddleName 
2

ich denke, unter Abfrage hilfreich seinen Vornamen und Nachnamen von Fullnamen zu spalten, selbst wenn es nur Vorname ist. Zum Beispiel: 'Philip John' kann in Philip und John aufgeteilt werden. Aber wenn es nur Philip gibt, wegen des charIndex von Space ist 0, wird es Ihnen nur geben ".

Versuchen Sie den folgenden.

declare @FullName varchar(100)='Philp John' 

Select 
    LTRIM(RTRIM(SUBSTRING(@FullName, 0, CHARINDEX(' ', @FullName+' ')))) As FirstName 
, LTRIM(RTRIM(SUBSTRING(@FullName, CHARINDEX(' ', @FullName+' ')+1, 8000)))As LastName 

Ich hoffe, dies wird Ihnen helfen.:)

Verwandte Themen