2010-06-16 3 views
5

Ich habe eine SQL-Tabelle mit einer Spalte namens FullName, die zum Beispiel "John Smith" enthält.Wie wird nach Nachname in einer Spalte mit vollem Namen sortiert?

Wie können die Daten nach dem Nachnamen geordnet werden, der in der FullName-Spalte erscheint?

Für einen langen Namen wie "Laurence John Fishburne" möchte ich die Daten mit dem Wort "Fishburne" bestellen.

So werden Namen in der Reihenfolge

  • Vorname
  • Mittel Namen
  • Nachname

I Server 2005.

+1

Definieren Sie den Nachnamen. Mein Name ist "Robert Henry Smith". –

+0

@Dominic: Es müsste wahrscheinlich das letzte Wort sein, dem ein Leerzeichen folgt. Natürlich wird es Ausnahmen geben, aber das würde wahrscheinlich für die meisten Namen funktionieren. – FrustratedWithFormsDesigner

+0

Ich habe in der Frage geklärt. – GateKiller

Antwort

1

Im Zweifelsfall do it yourself:

Select 
* 
From 
Users 
Order By 
LTrim(Reverse(Left(Reverse(FullName), CharIndex(' ', Reverse(FullName))))) Asc, 
FullName Asc -- Fall-over for when there isn't a last name 
0

Es ist wirklich bin mit Microsoft SQL gespeichert hängt davon ab, wie Namen gespeichert werden. „Last First Middle“ Unter der Annahme, könnten Sie so etwas wie

order by substring(0, charindex(',', FullName)) 
tun

Sie haben mit ihm ein wenig Geige, aber ich glaube, dass sollte funktionieren.

+1

und zusätzlich, wenn LastName ist das Recht am meisten Token in der Zeichenfolge dann verwenden Sie die reverse() -Funktion zusammen mit der obigen Lösung. –

+3

Bitte lesen Sie die Frage noch einmal. Außerdem ist Ihre Syntax für die Teilzeichenfolgenfunktion ungültig. – GateKiller

+0

@GateKiller - meine Antwort wurde vor der erneuten Klärung in der ursprünglichen Frage geschrieben. – AllenG

1
create table foo(fullname varchar(100)) 
go 

insert into foo values ('Harry Smith'); 
insert into foo values ('John Davis'); 
insert into foo values ('Allision Thomas Williams'); 

SELECT fullname 
    , REVERSE(left(REVERSE(fullname), charindex(' ',REVERSE(fullname))-1)) 
    FROM foo 
ORDER BY REVERSE(left(REVERSE(fullname), charindex(' ',REVERSE(fullname))-1)) 

Ausgang:

fullname     (No column name) 
John Davis     Davis 
Harry Smith     Smith 
Allision Thomas Williams Williams 
+0

Sie müssen nicht so viele Funktionsaufrufe (REVERSE + links + REVERSE + charindex + REVERSE) verwenden, um die letzte Zeichenfolge des FullName zu ermitteln. Ein einziges RECHTS + CHARINDEX + REVERSE sollte alles sein, was du brauchst, siehe meine Antwort. –

7

Ich möchte etwas tun:

SELECT FullName 
FROM TABLE 
ORDER BY REVERSE(SUBSTRING(REVERSE(FullName), 0, CHARINDEX(' ', REVERSE(FullName)))) 
+4

während nicht die effizienteste/optimale Lösung das funktioniert, warum die -1 ?? –

2

dies versuchen, verwendet es die minimale Anzahl von Funktionen, um den letzten Platz in FullName s zu finden Tring, die die Leistung helfen sollte:

DECLARE @YourTable table (FullNamevarchar(30)) 

INSERT @YourTable VALUES ('Harry Smith'); 
INSERT @YourTable VALUES ('John Davis'); 
INSERT @YourTable VALUES ('Allision Thomas Williams'); 

SELECT 
    FullName 
     ,RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) AS SortBy 
    FROM @YourTable 
    ORDER BY RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 

OUTPUT:

FullName      SortBy 
------------------------------ ------------------------------ 
John Davis      Davis 
Harry Smith     Smith 
Allision Thomas Williams  Williams 

(3 row(s) affected) 

Für die beste Leistung und genaueste Art, müssen Sie den Namen in Vorname, Zweiter Vorname aufzuschlüsseln und Name Felder aus. Nur der Benutzer, der die Daten eingibt, kann wirklich verstehen, welcher Teil von FullName der Nachname ist.

+0

Dies schlägt fehl, wenn die Spalte nur einen einzelnen Namen hat. – GateKiller

+0

@GateKiller, verwenden Sie dies, funktioniert für einen NULL-Namen und einen Namen ohne Leerzeichen: 'RECHTS (fullname, ISNULL (NULLIF (CHARINDEX ('', REVERSE (fullname)) - 1, -1), LEN (fullname))) ' –

1

Dies wird den Trick:

create table #tmpTable 
(
    ID int identity(1,1) primary key, 
    FullName varchar(100) not null 
); 

insert into #tmpTable(FullName) values('Big John Sansom'); 
insert into #tmpTable(FullName) values('Mike Douglas Reid'); 
insert into #tmpTable(FullName) values('First Second Last'); 
insert into #tmpTable(FullName) values('JustOneTokenForName'); 

select 
    FullName, 
    LastName = case 
     when CHARINDEX(FullName,' ') = 0 THEN FullName 
     else RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 
    end 
from #tmpTable 
order by LastName 

drop table #tmpTable 
+0

Dies schlägt fehl, wenn die Spalte nur einen einzelnen Namen hat. – GateKiller

+3

@GateKiller: Vielleicht wäre es hilfreich für alle Leser, wenn Sie Anforderungen wie diese in Ihrer Frage zu qualifizieren. Lösung jetzt aktualisiert, um diese zusätzliche Anforderung aufzunehmen. –

5

Statt der Berechnung, was der letzte Name jedes Mal, wenn Sie die Abfrage ausführen möchten, können Sie eine berechnete Spalte, die den Ist-Wert in eine Spalte bleibt das kann wie jede andere Spalte verwendet werden.

ALTER TABLE Customer 
    ADD LastName AS 
     RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) PERSISTED 

Dieses Fügt die Spalte Name VZ zum Customer-Tabelle, verwendet die Funktion den Wert des Nachnamens berechnen angegeben, und speichert sie auf der physischen Tabelle. Das Schlüsselwort PERSISTED am Ende ist erforderlich, damit der Wert auf dem Datenträger gespeichert wird. Andernfalls wird er jedes Mal berechnet, wenn eine Abfrage ausgeführt wird.

Edit: Um mit Werten ohne Leerzeichen umgehen:

ALTER TABLE Customer 
    ADD LastName AS 
    case when CHARINDEX(' ', REVERSE(FullName)) > 0 
    then RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 
    else 
    FullName 
    end 
    PERSISTED 

Obwohl Sie mit dieser Funktion Geige können, wie Sie wollen, um zu bestimmen, was in diesem Fall passiert. Ich möchte zeigen, dass Fallanweisungen verwendet werden können. Möglicherweise möchten Sie auch alle Ausgabepfade auf denselben Typ umwandeln, um Typkonflikte zu vermeiden.

+0

Dies funktioniert nur in Sql Server 2005+ –

+0

Dies schlägt fehl, wenn die Spalte nur einen einzigen Namen hat. – GateKiller

+0

+1 für die vorgeschlagene Spalte - alle anderen Lösungen können keine Indizes verwenden. Am besten wäre es, dies als Übergangslösung zu verwenden, bis der Name in mehrere Spalten und das Frontend/reports/etc aufgeteilt werden kann. geändert, um damit umzugehen. –

0

Abfrage

SELECT stringrowname FROM tablename 
ORDER BY SUBSTRING_INDEX((stringrowname)," ",-1); 

Es wird die Saiten, um durch letztes Wort zurück.

Verwandte Themen