Re: Ordenar resultado por números en campo varchar

From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ordenar resultado por números en campo varchar
Date: 2010-10-01 18:18:16
Message-ID: 4CA625E8.1040308@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 01/10/2010 19:15, Rodrigo Ruiz escribió:
> El 01/10/2010 11:57, Oswaldo Hernández escribió:
>> El 30/09/2010 18:22, Rodrigo Ruiz escribió:
>>> Estimados,
>>> la siguiente representa parte del resultado de una consulta sobre una
>>> tabla y que se ordena por el campo 'indice' de forma ascendente.
>>>
>>> # select * from tabla order by indice asc;
>>>
>>> id | titulo | indice
>>> ----+----------+--------
>>> 106 | texto 4 | 1.1
>>> 115 | texto 13 | 1.10
>>> 116 | texto 1 | 1.11
>>> 107 | texto 5 | 1.2
>>> 108 | texto 6 | 1.3
>>> 109 | texto 7 | 1.4
>>> 110 | texto 8 | 1.5
>>> 111 | texto 9 | 1.6
>>> 112 | texto 10 | 1.7
>>> 113 | texto 11 | 1.8
>>> 114 | texto 12 | 1.9
>>> 117 | texto 2 | 2.1
>>> 118 | texto 3 | 2.2
>>>
>>> El campo indice es un varchar, si notan, luego del punto 1.1 salta al
>>> 1.10, el cual necesito se presente siguiendo al punto 1.9.
>>> Intenté pasando el campo a numérico con cast, sin embargo se me
>>> complicó, pues podrían existir puntos del tipo 1.2.6 o más detallado
>>> aún.
>>> La pregunta ya la podrán adivinar, cómo podría obtener el resultado de
>>> la consulta de manera ordenada por índice?
>>>
>>
>>
>> select indice
>> from (values ('4.0.3.2'), ('1.2.3.4'), ('2.3.4.5'),
>> ('20.3.1'), ('20.3'), ('4.1'), ('10.3'),
>> ('0.5'), ('10.2.7')
>> ) foo(indice)
>> order by regexp_split_to_array(indice, E'\\.')::integer[];
>>
>> indice
>> ---------
>> 0.5
>> 1.2.3.4
>> 2.3.4.5
>> 4.0.3.2
>> 4.1
>> 10.2.7
>> 10.3
>> 20.3
>> 20.3.1
>> (9 filas)
>>
>>
>> :)
>>
>
> Perfecto!... muchas gracias. Estaba intentando lo sugerido por Alvaro y
> Horacio, separar por los puntos y ordenar, pero tenía el problema de no
> conocer la profundidad de los indices.
> Sin embargo, con regexp_split_to_array() funcionó de pelos.

Ten en cuenta que solo es válido para números y separados por '.', si
tienes algun valor tipo '1.2.B' ó '1.2-3' fallará.

Saludos,

--
Oswaldo Hernández

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Virginia Frade 2010-10-01 18:29:05 Anular mi suscripción
Previous Message Jaime Casanova 2010-10-01 17:15:54 Re: Problemas con PgAdmin y PG9.0