2011-08-25 15 views
7

Ho un paio di dischi che devono essere ordinati ma il campo è varchar. Usano l'alfabeto inglese dalla A-Z. Dopo Z va da AA, AB, AC, ecc ... per esempio:Come si ordina un campo di testo alfabetico?

CREATE TABLE #foo(x VARCHAR(30)); 

INSERT #foo(x) SELECT 'A' 
UNION SELECT 'AA' 
UNION SELECT 'Z' 
UNION SELECT 'B' 
UNION SELECT 'AB' 
UNION SELECT 'BB'; 

L'ordinamento che voglio nel risultato è:

A 
B 
Z 
AA 
AB 
BB 

so che dovrei utilizzare un campo numero e ordina per quello, ma al momento non ho questa opzione. Sto usando SQL Server e il front end è su un report in Access 2010.

+3

Avete una domanda? – Jacob

+2

Ho aggiunto la struttura della tabella e i risultati desiderati per @Rick. –

risposta

12

Questo potrebbe funzionare. È possibile ordinare per lunghezza del valore che raggrupperà i singoli caratteri seguiti da caratteri doppi. All'interno di questi gruppi i valori saranno ordinati alfabeticamente.

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY LEN(Column1) 
     , Column1 
+3

+1 per la semplicità –

+0

Non sargable, comunque. –

2

Ecco un esempio per voi

Select * 
from MyTable 
Order By foo ASC, foo2 ASC, foo3 ASC 

utilizzando l'ordine per colonna ASC vi permetterà di ordinare quella colonna in ordine alfabetico

5
Declare @SomeStuff table (val varchar(10)); 

Insert @SomeStuff (val) Values ('a'); 
Insert @SomeStuff (val) Values ('b'); 
Insert @SomeStuff (val) Values ('c'); 
Insert @SomeStuff (val) Values ('az'); 
Insert @SomeStuff (val) Values ('ab'); 
Insert @SomeStuff (val) Values ('zz'); 
Insert @SomeStuff (val) Values ('abc1'); 


Select * From @SomeStuff order by LEN(val), val 

Utilizza SQL Server, ma dovrebbe funzionare.

Risultati:

val 
--- 
a 
b 
c 
ab 
az 
zz 
abc1 
6

OK, ho un po 'confuso. Sembra che tu voglia un ordinamento originale. Vuoi prima lettere singole e poi normale ordine. (Una specie completamente normale avrebbe A, AA, AB, AC, poi B)

In primo luogo, semplice ordinamento su un campo alfabetico

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by SORTFIELD 

Ma non è quello che vuoi. Il problema è che non ci dici mai dove vuoi AAA. Va dopo AA o dopo ZZ?

AAA Dopo ZZ:

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by LEN(SORTFIELD), SORTFIELD 

AAA Dopo AA (prima AB)

select SORTFIELD, OTHER, COLUMNS, IN-TABLE 
from MYTABLE 
order by case LEN(SORTFIELD) when 1 then 0 else 1 end , SORTFIELD 
Problemi correlati