2010-11-02 6 views
5

Necesito pedir una consulta de selección usando una columna varchar, usando el orden numérico y de texto. La consulta se realizará en un programa java, utilizando jdbc sobre postgresql.¿Cómo ordeno una columna VARCHAR en PostgreSQL que contiene palabras y números?

Si uso ORDER BY en la cláusula select puedo obtener:

1 
11 
2 
abc 

Sin embargo, necesito obtener:

1 
2 
11 
abc 

El problema es que la columna también puede contener texto.

Esta pregunta es similar (pero dirigido para SQL Server):

How do I sort a VARCHAR column in SQL server that contains words and numbers?

Sin embargo, la solución propuesta no funcionaba con PostgreSQL.

Gracias de antemano, cordiales,

Respuesta

6

I tenían el mismo problema y el siguiente código resuelve:

SELECT ... 
    FROM table 
    order by 
    CASE WHEN column < 'A' 
     THEN lpad(column, size, '0') 
    ELSE column 
     END; 

El tamaño var es la longitud de la columna de varchar, por ejemplo 255 para variar (255).

+0

Esta solución funcionó, gracias. –

+1

Tenga en cuenta que esto crea una dependencia entre el tamaño de la columna y el orden, lo que provocará que no se rompa la cabeza en caso de que se cambie el tamaño de la columna. –

4

Puede utilizar expresiones regulares para hacer este tipo de cosas:

select THECOL from ... 
order by 
    case 
    when substring(THECOL from '^\d+$') is null then 9999 
    else cast(THECOL as integer) 
    end, 
    THECOL 

En primer lugar, el uso de expresiones regulares para detectar si el contenido de la columna es un número o no. En este caso, uso '^ \ d + $' pero puede modificarlo para adaptarlo a la situación.

Si la expresión regular no concuerda, devuelva un número grande para que esta fila quede al final del pedido.

Si la expresión regular coincide, conviértala al número y luego selecciona eso.

Después de esto, ordene regularmente con la columna.

+0

Esta es una solución limpia. –

+0

Justo cuando deja de buscar la mejor solución y decide una solución alternativa, encuentra la solución adecuada. Mi sombrero es para usted señor, gracias! – emptywalls

Cuestiones relacionadas