Respuesta: Ordenar Consulta algo de explicación:
ordeno por 3 partes,
1) por la primera letra, que siempre es una:
ORDER BY LEFT(CodigoInterno,1),
esto usa como primer criterio para ordenar la S, A, H, P que tienes
2) por el resto de la primera parte antes del guión, lo haya o no, pero quitando la primera letra y haciendo un casting a número (al substring_index le hacemos un substring que carga el número de caracteres total de ese substring_index menos 1, y lo pongo en negativo para que separe esa número de caracteres comenzando desde el final. Es decir, separo de la primera parte hasta el guión (si lo hay) o toda esa primera parte si no lo hay, toda la cadena menos el primer carácter (recuerda que se trata de S,A,H,P), y eso lo hago mediante un SUBSTRING(cadena,- (longitud de la cadena -1)), y mediante un cast a numérico ya puedo ordenar como número esa parte.
CAST(SUBSTRING(SUBSTRING_INDEX(CodigoInterno,'-',1), - (LENGTH(SUBSTRING_INDEX(CodigoInterno,'-',1))-1)) AS UNSIGNED),
3) si hay guión (lo compruebo con INSTR, buscando la posición del guión (si la hay, su posición en la cadena será un número mayor que 0), hago un cast a número de substring_index, con negativo, es decir, empezando desde el final; pero si no hay guión, y aquí radicaba parte del problema, la posición no será mayor que 0 y, en ese caso, ordenará por 0: eso lo hago con el IF
IF(INSTR(CodigoInterno,'-') > 0, CAST(SUBSTRING_INDEX(CodigoInterno, '-',-1) AS UNSIGNED),0)
Naturalmente, también le hago un cast a numérico.
Ya tengo las tres partes y ordeno de forma consecutiva: primero por la primera, segundo por la segunda y tercero por la tercera. Eso es todo.
Última edición por jurena; 25/12/2009 a las 03:36 |