2013-11-27 11 views
12

Ho seguito i valori in mio tavolo:SQL Server 2008 - Ordina per stringhe con numero numericamente

ABC 
ABC1 
ABC2 
ABC3 and so on... 

ABC11 
ABC12 
ABC13 and so on.. 

ABC20 
ABC21 
ABC22 and so on.. 

Quindi, in pratica quello che ho è un qualsiasi valore stringa (non sempre ABC, qualsiasi valore stringa) che può essere sia seguito dal numero o potrebbe essere solo una stringa senza il numero.

Quando faccio select * from tabella ordine la mia colonna asc vengo seguenti risultati:

ABC 
ABC1 
ABC11 
ABC12 
ABC13 
ABC2 
ABC20 
ABC21 
ABC22 
ABC3 
ABC31 
ABC32 

ho bisogno allineati numericamente:

ABC 
ABC1 
ABC2 
ABC3 
ABC11 
ABC12 
ABC13 
ABC20 
ABC21 
ABC22 
ABC31 
ABC32 

come può essere realizzato?

+0

Hai idea di quanti caratteri alla fine può essere numerici? – DarkKnight

+3

E dove AB1 si adatta all'ABC1? Prima o dopo? - La migliore scommessa, direi è di mantenere una colonna di ordinamento per evitare l'ordinamento su cose del genere. Perché si può finire rapidamente con un ordine piuttosto complesso con il quale rallentare la tua richiesta. –

+3

Quindi "ABC" può effettivamente essere una stringa qualsiasi con qualsiasi lunghezza? Può contenere anche caratteri numerici, ad es. 'A1B2C1234'? Se è così, come vuoi ordinarlo? –

risposta

6

Si potrebbe rimuovere i primi tre caratteri e gettato il resto a int

SELECT Value, 
     Num=CAST(RIGHT(Value, LEN(Value) - 3) AS int) 
FROM dbo.TableName 
ORDER BY Num 

Demo

+2

Bella soluzione, se la stringa ha sempre lunghezza 3 - la formulazione nella domanda sembra suggerire che non è il caso però ... – Josien

+1

Funzionerà solo per la stringa di carattere 3 fissa, non funzionerà per stringhe come "ABCD11" –

+0

@ UpendraChaudhari: Sì, questo è quello che Josien ha già menzionato. Ho trascurato la parte che la stringa è arbitraria. –

2

Si potrebbe adattare la funzione di RemoveNonAlphaCharacters in this answer per filtrare tutto tranne i numeri, e poi utilizzare un ORDER BY usando quella funzione.

11

È possibile farlo utilizzando la funzione PATINDEX() come di seguito:

select * from Test 
order by CAST(SUBSTRING(Name + '0', PATINDEX('%[0-9]%', Name + '0'), LEN(Name + '0')) AS INT) 

SQL Fiddle Demo

Se hai i numeri nel bel mezzo della stringa, allora avete bisogno di creare piccole funzione definita dall'utente per ottenere numero da stringa e ordinare i dati in base a quel numero come di seguito:

CREATE FUNCTION dbo.fnGetNumberFromString (@strInput VARCHAR(255)) 
RETURNS VARCHAR(255) 
AS 
BEGIN 
    DECLARE @intNumber int 
    SET @intNumber = PATINDEX('%[^0-9]%', @strInput) 

    WHILE @intNumber > 0 
    BEGIN 
     SET @strInput = STUFF(@strInput, @intNumber, 1, '') 
     SET @intNumber = PATINDEX('%[^0-9]%', @strInput) 
    END 

    RETURN ISNULL(@strInput,0) 
END 
GO 

È possibile ordinare i dati b y:

select Name from Test order by dbo.fnGetNumberFromString(Name), Name 
+0

Oooh, bello, +1! Funziona bene fino a quando la parte della stringa viene prima e la parte numero arriva per ultima. – Josien

+0

Funzionerebbe alla grande se tutti i miei valori fossero nel formato: numero stringa, tuttavia ho alcuni valori come AD2_NDU, ECOS_10_CHANGEOFSTATUS, ecc.e la soluzione sopra riporta errori per questi valori ... c'è qualcosa che può essere aggiunto per applicare solo questo formato alla stringa che finisce con i numeri? – user2179092

+0

Se non c'è tra una stringa e l'altra, come dovrebbe essere ordinata? cioè, che verrà prima in questi numeri? "AD2_NDU" o "ABC" o "ABC1" o "ABC2" –

2

in ordine di dichiarazione, anteporre abbastanza zeri con cui valore contiene un qualsiasi numero in esso per rendere tutto alphanumerica valore stessa lunghezza

SELECT ColName 
FROM TableName 
ORDER BY 
CASE WHEN ColName like '%[0-9]%' 
THEN Replicate('0', 100 - Len(ColName)) + ColName 
ELSE ColName END 
Problemi correlati