Posts etiquetados ‘Programación’

Ordenación natural en postgresql

Domingo, 8 Febrero, 2009

Continuando el post de ordenación natural añado un enlace al sitio oficial de PostgreSQL en el que un comentarista indica la forma de ordenar de forma natural las secuencias de caracteres que incluyen números. Y por si alguna vez desapareciese dicho comentario, copio las funciones aquí abajo.

CREATE FUNCTION btrsort_nextunit(text) RETURNS text AS $$
SELECT CASE WHEN $1 ~ ‘[^0-9]+’ THEN
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[^0-9]+’))+1 ),
” )
ELSE
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[0-9]+’))+1 ),
” )
END
$$ LANGUAGE SQL;

CREATE FUNCTION btrsort(text, integer) RETURNS text AS $$
SELECT CASE WHEN $2-1>0
THEN
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ”), 1, 12), 12, ‘ ‘) ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ”), 1, 12), 12, 0) || btrsort(btrsort_nextunit(btrsort_nextunit($1)), $2-1)
ELSE
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ”), 1, 12), 12, ‘ ‘) ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ”), 1, 12), 12, 0)
END
;

$$ LANGUAGE SQL;

CREATE FUNCTION btrsort(text) RETURNS text AS $$
SELECT btrsort($1, 10);
$$ LANGUAGE SQL;

La forma de usarlas es la siguiente. Primero vemos la ordenación que no tiene en cuenta los números (se observa que devuelve 10 como si fuese menor que 8):

SELECT room_number FROM rooms ORDER BY room_number;
room_number
———–
10
8
9
9a

Para ordenar de forma natural:

SELECT room_number
FROM (SELECT room_number, btrsort(room_number) AS room_sort
FROM rooms
ORDER BY room_sort) AS foo

Lo que devuelve:
room_number
———–
8
9
9a
10

Quiero agradecerle al autor original de estas funciones porque me resolvió un verdadero problema en el trabajo. Gracias Ryan Hughes.

El enlace al sitio oficial con el comentario de Ryan.

Caracteres españoles en javascript

Viernes, 5 Septiembre, 2008

Una expresión regular para reconocer un texto formado sólo por letras, números, guiones bajos y los caracteres específicos del español (ñ, Ñ, ç, Ç, vocales acentuadas y úes con diéresis):

/^[\w\u00f1\u00d1\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00c7\u00e7\u00dc\u00fc]+$/

Los códigos unicode usados son:

00f1 -> ñ
00d1 -> Ñ
00e1 -> á
00e9 -> é
00ed -> í
00f3 -> ó
00fa -> ú
00c1 -> Á
00c9 -> É
00cd -> Í
00d3 -> Ó
00da -> Ú
00c7 -> Ç
00e7 -> ç
00dc -> Ü
00fc -> ü

Ordenación alfabética respetando las secuencias numéricas

Sábado, 15 Diciembre, 2007

En Microsiervos comentan el problema de ordenar cadenas de caracteres que incluyen números. Lo habitual es que las cifras del número se tomen como simples caracteres y se comparen de una en una en vez de tener en cuenta el valor real del número completo.

A lo que me refiero es a que para un lenguaje de programación “nombre2.txt” normalmente se considera que viene después de “nombre10.txt” mientras que para cualquier persona el orden es el contrario.

En el artículo enlazado hay imágenes que muestran el problema y enlaces a posibles soluciones.