2012-09-21 17 views
6

tengo una columna llamada Number rellena con estos datos (columna es nchar):Ordenar por sólo la parte numérica de una cadena

1 
2 
1091 
3 
20 
2B 

Quiero una instrucción de selección que dan este orden:

1 
2 
2B 
3 
20 
1091 

¿Cómo puedo lograr esto? Gracias a todos por su ayuda

(editado)

+0

¿Cuál es el tipo de columna? – NicoRiff

+3

¿Una orden que cambia los valores de 2B a 3B? –

+0

En la primera parte tienes 2B en el segundo 3B. Typo? –

Respuesta

17

Usted puede realizar algunos trucos mediante la conversión a un valor numérico después de descubrir la ubicación de la primera no -numérico. Agregar un carácter aleatorio al final lo hace tratar todas las cadenas de la misma manera, incluso si la cadena original no contiene un alfabético.

SELECT [Number] FROM dbo.TableName 
ORDER BY CONVERT(INT, LEFT(Number, PATINDEX('%[^0-9]%', Number + 'z')-1)); 
+0

gracias Aaron. funciona encantador. – BernieSF

+0

Aaron - Creo que es importante dar a los futuros visitantes a la pregunta la terminología correcta para usar. A veces, un enlace a la documentación es una bonificación y este caso, casi obligatorio. Una búsqueda de 'Sql Server' y' convert' genera muchos hits falsos ... I * think * se convierte en un entero. El '-1' en tu expresión me confunde por completo. Si el código hace lo que yo pienso/hace, es decir, extrae solo la parte numérica del 'Número', entonces' 32a', '32fred' y' 32c' saldrían desordenados, ya que la parte alfabética no es considerado. –

+1

@Jeremy una solución a una pregunta de codificación no debería incluir la definición de cada función utilizada en la solución. ¿Realmente necesito escribir un párrafo sobre lo que CONVERT hace? El OP ciertamente no lo creía, y probablemente usted sea el único lector que también lo esperaría. Si se requiere * clasificación adicional *, debe indicarse en la pregunta. Si * supongo * que se requiere una cierta clasificación, como sugiere, entonces la respuesta es * más * que la OP solicitada. Entonces, al final, ¿creo que esta respuesta ayuda al OP más de lo que apunta a los géneros naturales de Oracle y MySQL? Sí. –

1

Lo que usted está buscando se llama una especie NATURAL, que es diferente de la clase regular que la mayoría de los sistemas dan. He encontrado un puñado de publicaciones aquí en Stack Overflow que cubre géneros naturales en varios motores SQL populares, incluida una breve discusión sobre SQL Server.

Las ideas aquí pueden ayudarlo a comenzar con una solución.

Oracle: How can I implement a "natural" order-by in a SQL query?

Es posible que tenga que cambiar la sintaxis SQL para su motor embargo.

encontrado otra versión de MySQL:

Natural Sort in MySQL

No se encuentra ninguna para SQL Server todavía.

Edit3

Ah, éste cubre algunas ideas de SQL Server también:

Natural Sort in MySQL

+2

No veo cómo ninguno de estos enlaces ayuda a resolver el problema. –

+0

@ Aaronofertrand - El OP necesitaba un tipo natural, aunque el OP no utilizó ese término con mi nombre. Como los motores SQL no tienen un tipo natural integrado, uno tiene que hacerse usando una expresión. Mis enlaces cubrieron diferentes formas en que las personas han obtenido un tipo natural en varias formas de SQL. Uno de ellos podría haber sido adaptado. –

+2

Bueno, no lo necesitaban en Oracle o MySQL, y la respuesta de MySQL tampoco parece tener ninguna respuesta válida para SQL Server, como usted sugiere. Lo más cerca que encontré fue uno que contenía 'MID' pero eso es una función de acceso, no SQL Server. –

1

Utilice PATINDEX, consulte este código SQL Fiddle. @AaronBertrand acaba de responder cuando estaba probando.

Solo para agregar un poco más de valor e información, marque this SQLServerCentral link ya que puede encontrar más respuestas.

Y mira esto Natural (human alpha-numeric) sort in Microsoft SQL 2005, muchas respuestas útiles y variaciones.

+0

¿Pueden algunos de los downvoters comentar sobre lo que está mal? Solo estaba agregando más información sobre la respuesta que ya era útil ... gracias – Yaroslav

+2

EH, algunos han estado contentos con esta pregunta. Tenga un +1 para proporcionar documentación, no solo una respuesta mágica de encantamiento. –

+1

No voté (todavía) pero, por lo general, si intenta agregar información a una respuesta existente, agrega un comentario, no una respuesta adicional. –

Cuestiones relacionadas