¿Forzar el orden numérico en una columna varchar de SQL Server 2005 que contiene letras y números?

StackOverflow https://stackoverflow.com/questions/75361

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una columna que contiene las cadenas 'Operador (1)' y así sucesivamente hasta el 'Operador (600)' hasta ahora.

Quiero ordenarlos numéricamente y se me ocurrió

select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

que es muy muy feo.

¿Mejores sugerencias?

¿Fue útil?

Solución

Es eso, InStr()/SubString(), cambiar Operador(1) a Operador(001), almacenar la n en Operador(n) por separado o crear una columna calculada que oculta la fea manipulación de cadenas.Lo que tienes parece estar bien.

Otros consejos

Si tú realmente tener Para dejar los datos en el formato que tiene, y agregar una columna de orden de clasificación numérica es la mejor solución, considere envolver la manipulación del texto en una función definida por el usuario.

seleccione colname del orden de la tabla por dbo.udfSortOperator(colname)

Es menos feo y te da algo de abstracción.Hay una sobrecarga adicional de la llamada a la función, pero en una tabla que contiene miles de filas en un servidor de base de datos que no tiene un gran impacto, no es una preocupación importante.Tome notas en la función para optimizarla más tarde según sea necesario.

Mi respuesta sería cambiar el problema.Agregaría un campo operatorNumber a la tabla si eso fuera posible.Cambie las rutinas de actualización/inserción para extraer el número y almacenarlo.De esa manera, el acierto de conversión de cadena es solo una vez por registro.

La lógica de pedido requeriría la conversión de cadenas cada vez que se ejecuta la consulta.

Bueno, primero define el significado de esa columna.¿Es operador un nombre que pueda justificar el uso de caracteres?¿O es un número?

Si el campo es un nombre, entonces utilizará caracteres y luego querrá determinar la longitud fija.Rellene todos los nombres de operadores con ceros a la izquierda.Definir reglas de nomenclatura para operadores (es decir,Sin letras.O los códigos que usarías en una serie como "A001")

Un índice ordenará los datos físicos en el servidor.Y un nombre de texto definido correctamente los ordenará en una consulta.Querrías ambos.

Si el operador es un número, entonces el tipo de datos para esa columna es incorrecto y es necesario cambiarlo.

Columna calculada indexada

Si se encuentra realizando un pedido o consultando de otro modo operator columna con frecuencia, considere crear una columna calculada para su valor numérico y agregarle un índice.Esto le dará una columna calculada/persistente (que suena como un oxímoron, pero no lo es).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top