2012-04-23 2 views
6

Ich habe dieseBenutzerdefinierte Sortierreihenfolge in SQL gemischten Server-Datentypen in einer varchar gespeichert

declare @testtable table (test nvarchar(max)) 


insert into @testtable (test) values ('1.2.3') 
insert into @testtable (test) values ('1.20.3') 
insert into @testtable (test) values ('1.19.x') 
insert into @testtable (test) values ('1.x.x') 
insert into @testtable (test) values ('1.19.3') 
insert into @testtable (test) values ('DEC09') 
insert into @testtable (test) values ('Plutonium') 
insert into @testtable (test) values ('dec09') 
insert into @testtable (test) values ('N/A') 
insert into @testtable (test) values ('MyTest20') 
insert into @testtable (test) values ('20MyTest') 
insert into @testtable (test) values ('1.4.18') 
insert into @testtable (test) values ('1.4.168') 

select * from @testtable 
order by test asc; 

die

1.19.3 
1.19.x 
1.2.3 
1.20.3 
1.4.168 
1.4.18 
1.x.x 
20MyTest 
DEC09 
dec09 
MyTest20 
N/A 
Plutonium 

gibt, aber ich würde die Ausgabereihenfolge

1.2.3 
1.4.18 
1.4.168 
1.19.3 
1.19.x 
1.20.3 
1.x.x 
20MyTest 
DEC09 
dec09 
MyTest20 
Plutonium 
N/A 

sein mögen (beachten Sie, dass N/A „Magie“ ist und immer größte „Version“ (ex 1.2.3) immer 3 Ziffern haben, obwohl eine oder mehr Ziffer char sein kann x zeigen „eine beliebige Ziffer“, die immer möglichst große digit)

berücksichtigt werden sollten Wie kann ich das erreichen in SQL Server?

+2

+ 1 Für DDL und INSERTs. Welche SQL Server-Version? –

+0

Die Versionen dieser ist anders, weil die Lösung auf verschiedenen Servern – Millerbean

+0

* Wie * anders platziert werden? Was ist die früheste Version, auf der dies ausgeführt werden soll? Bitte fügen Sie die entsprechenden Tags hinzu. –

Antwort

3
select TT.* 
from @testtable as TT 
order by case when TT.test = 'N/A' then 1 else 0 end, 
     case when isnumeric(parsename(test, 3)+'E+00') = 1 then cast(parsename(test, 3) as int) else 99999 end, 
     case when isnumeric(parsename(test, 2)+'E+00') = 1 then cast(parsename(test, 2) as int) else 99999 end, 
     case when isnumeric(parsename(test, 1)+'E+00') = 1 then cast(parsename(test, 1) as int) else 99999 end, 
     test 
+1

Große Lösung, aber eine Sache ist, dass die Säule ein varchar ist und wird als varchar sortiert werden. Sie sollten erwägen, diese Lösung unter Verwendung dieses zu erhalten getan: http://stackoverflow.com/a/119842/326923 Dieses –

+0

geben Sie mir das gleiche Ergebnis wie meine eigenen oben – Millerbean

+0

1.4.168 Bedürfnissen geschrieben mit 1,4 zu tauschen.18, also immer noch nicht 100% :-) – Millerbean

0

Dies sollte einfach sein.

Erstellen Sie eine neue Tabelle mit zwei Spalten:

OrderValue String

Beschr String

Legen Sie die Werte in der gewünschten Reihenfolge

a- 1.2.3

b wollen - 1.4.18

c- 1.4.168

d- 1.19.3

e- 1.19.x

f- 1.20.3

g- 1.xx

h- 20MyTest

i- DEC09

j- dec09

k- MyTest20

l- Plutonium

m- N/A

nun die Testtable mit dieser neuen Tabelle und Ordnung durch "OrderValue" join

, dass es

Verwandte Themen