[Pgsql-ayuda] Duda con el Order by...

Alvaro Herrera Munoz alvherre@dcc.uchile.cl
Wed, 19 Nov 2003 21:42:40 -0300


On Wed, Nov 19, 2003 at 06:21:55PM -0600, Victor Chavez wrote:

> No entiendo la razon por la cual el espacio que existe
> despues de la cadena 'JUAN' no es tomado en cuenta
> para ordenar los registros pues como puede observarse
> en los registros que he marcado con *, la ordenacion
> se realiz? como si los otros registros que no tienen
> el asterisco no tuvieran ese espacio en blanco...

> Hay algun modo de indicar el tipo de ordenacion o cual
> puede ser la explicacion de esto, pues otras
> herramientas como las hojas de calculo por ejemplo,
> primero ordenan los registros con el espacio y luego
> los demas en orden del alfabeto...

Evidentemente quien hizo las otras herramientas no tenia mucha idea
sobre las reglas idiomaticas para ordenar cadenas de caracteres.  El
ordenamiento que ves, descartando espacios en blanco, es el correcto.
(No se quien es la autoridad al respecto, pero así es).

Si reinicializas (initdb?) la base de datos con lc_collate=C deberías
obtener el resultado que deseas, pero sospecho que vas a tener efectos
secundarios indeseables (no va a ordenar correctamente acentos o ñ).

Una alternativa, si el problema te preocupa mucho, es que prepares un
locale propio que considere el ordenamiento que a ti te interesa.  Pero
es una tarea ardua y francamente no te lo recomiendo en absoluto.

Otra alternativa podría ser algo como

select
nombre
from test
where nombre like 'JUAN%'
order by substring(nombre from length('JUAN%') for 1), nombre;

pero es horrible.  Aunque quizás encapsulado en una función no sea tan
grave ...

-- 
Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
FOO MANE PADME HUM