¿A que te refieres con formato 4455-45-5544?
¿Que se supone que es ese formato? ¿Una especie de máscara o Mask?
¿O es un ejemplo de un número y por formato te refieres a un número de 4 dígitos (máximo), guión, 2 dígitos (¿máaximo?), guión, y otros 4 dígitos más?
Efectivamente, la única forma de que acepte esos guiones es que sea almacenado en un campo CHAR/VARCHAR con el tamaño adecuado tanto para un máximo como el mínimo posible esperado.
Ahora bien, de hacerlo así, ordenar esa cadena ascendentemente no va a traerte buenos resultados muy posiblemente. Un texto como "322-32" es más "corto" que un "311-445". Y como así también no es lo mismo un "32-32" que un "3232". No al menos de la forma tradicional.
Deberás definir tu criterio de ordenación y posiblemente implementar tu propio algoritmo, lo que hará que debas descartar hacerlo por la via SQL y realizarlo por la vía sistema.
Lo bueno, es que hacerlo por sistema no es tan malo... La clase TList cuenta con el método SortList() que recibe como parámetro una función de comparación y podemos aprovecharlo para definir nuestro propio criterio de ordenación. Básicamente lo que nos está pidiendo es el puntero a una función que regrese 3 posibles valores: -1, 0 (cero) o 1.
-1 es para indicar cuando el elemento a la izquierda es el mayor.
0 cuando los elementos a comparar son iguales.
1 para cuando el elemento a la derecha es el mayor.
Tu implementarás algo así:
function ComparePhoneNumber(Phone1, Phone2: string): integer;
begin
// aquí todo lo que sea necesario para llevar la lógica adecuada
end;
Y luego al hacer algo como:
lista.SortList(ComparePhoneNumber);
Siendo Lista del tipo TList, aplicará el algoritmo de ordenamiento QuickSort y utilizará como criterio de ordenación tu función para dedidir el "orden" de cada uno.
Otra posibilidad es que al momento de guardar los números a la cadena ingresa la formatees para eliminar los guiones y concatenar los números. De esa forma ahora tendrás solamente un número y un ORDER BY ASC los pondrá en orden, ahora bien... esto no garantizará de que efectivamente esta ordenación natural numérica sea también lo que esperas. Naturalmente, al haber eliminado los guiones se pierde el sentido de los "grupos". Una manera de arreglarlo, es que no sólo guardes el número en formato numérico (sin los guiones) sino que adicionalmente dispongas de unos campos en los que guardes como están o deberían agruparse. Por ejemplo si siempre son 3 grupos pero que no siempre son de x cantidad fija de dígitos (pero si que exista un máximo) puedes disponer de 3 campos numéricos que almacenen la cantidad de dígitos. Y así por ejemplo una lectura 4,2,2 indicará que el número es xxxx-xx-xx
Y un 3,2,0 será xxx-xx.
Gracias a esos campos adicionales puedes recomponer el número al momento de mostrarlo, aprovechando funciones de concatenamiento.
Espero que se entienda la idea.
Creo que con estos tips se te pueden hacer algunas otras ideas. Hasta nada impide que pueda ser válido combinar estas 2 formas que te he presentado
Saludos,