Tri de la colonne VARCHAR avec des inputs alphanumériques

J'utilise SQL Server, la colonne est un VARCHAR(50) et je veux le sortinger comme ceci:

 1A 1B 2 2 3 4A 4B 4C 5A 5B 5C 5N 14 Draft 21 22A 22B 23A 23B 23C 23D 23E 25 26 FR01584 MISC 

Ce que j'ai jusqu'ici est:

 Select * From viewASD ORDER BY Case When IsNumeric(LEFT(asdNumNew,1)) = 1 Then CASE When IsNumeric(asdNumNew) = 1 Then Right(Replicate('0',20) + asdNumNew + '0', 20) Else Right(Replicate('0',20) + asdNumNew, 20) END When IsNumeric(LEFT(asdNumNew,1)) = 0 Then Left(asdNumNew + Replicate('',21), 20) End 

Mais cette instruction SQL met '14 Draft 'juste après' 26 '.

Quelqu'un pourrait-il aider? Merci

Votre déclaration WHERE est … curieusement complexe.

Il semble que vous souhaitiez sortinger les principaux numbers numériques dans un ordre entier, puis sortinger les autres. Si c'est le cas, vous devriez le faire en tant que clauses distinctes, plutôt que d'essayer de tout faire en un. Le problème spécifique que vous avez est que vous ne permettez qu'un nombre à un seul chiffre, au lieu de deux ou plus. (Et il n'y a rien de tel que deux .)

Voici votre correctif, avec un SQLFiddle , en utilisant deux tests de colonnes calculées distinctes pour votre ORDER BY. (Notez que cela suppose que la partie numérique de asdNumNew s'inserta dans un T-SQL int . Sinon, vous devrez ajuster le CAST et la valeur maximum sur le premier ELSE.)

 SELECT * FROM viewASD ORDER BY CASE WHEN ISNUMERIC(asdNumNew)=1 THEN CAST(asdNumNew as int) WHEN PATINDEX('%[^0-9]%',asdNumNew) > 1 THEN CAST( LEFT( asdNumNew, PATINDEX('%[^0-9]%',asdNumNew) - 1 ) as int) ELSE 2147483648 END, CASE WHEN ISNUMERIC(asdNumNew)=1 THEN NULL WHEN PATINDEX('%[^0-9]%',asdNumNew) > 1 THEN SUBSTRING( asdNumNew, PATINDEX('%[^0-9]%',asdNumNew) , 50 ) ELSE asdNumNew END 

Si tous les nombres dans la string sont raisonnablement petits, disons ne pas dépasser 10 numbers, vous pouvez développer tous les nombres dans la string pour être exactement 10 numbers:

123A -> 0000000123A

  S4 -> S0000000004 

A3B89 -> A0000000003B0000000089

et ainsi de suite, puis les sortinger

 -- Expand all numbers within S by zeros to be MaxLen create function [dbo].ExpandNumbers(@S VarChar(4000), @maxlen integer) returns VarChar(4000) as begin declare @result VarChar(4000); declare @buffer VarChar(4000); declare @Ch Char; declare @i integer; set @buffer = ''; set @result = ''; set @i = 1; while (@i <= len(@S)) begin set @Ch = subssortingng(@S, @i, 1); if ((@Ch >= '0') and (@Ch <= '9')) set @buffer = @buffer + @Ch else begin if (len(@buffer) > 0) set @result = @result + right(replicate('0', @maxlen) + @buffer, @maxlen); set @buffer = ''; set @result = @result + @Ch; end; set @i = @i + 1; end; if (len(@buffer) > 0) set @result = @result + right(replicate('0', @maxlen) + @buffer, @maxlen); return @result; end; -- Final query is select * from viewASD order by [dbo].ExpandNumbers(asdNumNew) 

ESSAYE ÇA
declare @t table (Numéro nvarchar (20)) insert dans @t sélectionner 'L010' union tous sélectionner 'L011' union tous sélectionner 'L011' union tous sélectionner 'L001' union tous sélectionner 'L012' union tous sélectionner '18'
union tous sélectionner '8' union tous sélectionner '17'

  union all select 'B004' union all SELECT 'B006' union all SELECT 'B008' union all SELECT 'B018' union all SELECT 'UG001' union all SELECT 'UG011' union all SELECT 'G001' union all SELECT 'G002' union all SELECT 'G011' select * from @t order by cast(SUBSTRING(Number, 1, case when patindex('%[^0-9]%',Number) > 0 then patindex('%[^0-9]%',Number) - 1 else LEN(Number) end) as int), Number 

o / p

 **Number** B004 B006 B008 B018 G001 G002 G011 L001 L010 L011 L011 L012 UG001 UG011 8 17 18