Re: Ordenar resultados de tipo 1.1, 1.2, 1.2.1, 1.3, etc...

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Rodrigo Ruiz <rruizf(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Ordenar resultados de tipo 1.1, 1.2, 1.2.1, 1.3, etc...
Date: 2012-04-17 19:14:19
Message-ID: 1334689375-sup-1997@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Excerpts from Rodrigo Ruiz's message of jue abr 12 19:13:57 -0300 2012:
> Estimados,
> hace un tiempo me ayudaron en cómo ordenar los resultados de una
> consulta de acuerdo a un varchar que debiese ser ingresado de la forma
> x.y.z, al estilo de capítulos.
> Esto lo hago ordenando por 'ORDER BY
> cast(regexp_split_to_array(e.capitulo, E'\\\\.') as integer[]) ASC', sin
> embargo, el sistema permite ingresar un dato de la forma 1.2.3. (punto
> al final), entonces la consulta se cae.
> Qué me recomiendan?, validar al momento de ingresar/modificar o cambiar
> la función al ordenar?
> Aún así, no estoy muy seguro como validar, al momento de
> ingresar/modificar, el campo capitulo para que vaya en la forma 1.2.3,
> con un solo punto entre números y sin otro caracter antes o después del
> primer y último numero.

Creo que lo más sensato sería tener una restricción CHECK que impida
poner puntos en otras posiciones que entre dos números. No es muy
sencillo pero podrías usar una expresión regular como esta:

create table libro (
capitulo text check (capitulo ~ '^([0-9]+\.|[0-9]+$)*([0-9]+)$')
);

Quizás haya una manera más simple de expresarlo, pero esa parece
funcionar bien.

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Carrillo 2012-04-17 22:09:27 Re: [pgsql-es-ayuda] Actualización de fzpgloader (modo grafico)
Previous Message Alvaro Herrera 2012-04-16 19:02:29 Re: Existe un tipo de dato Query o forma de castear un text a una sentencia SQL?