2012-03-01 29 views
50

Necesito ordenar una tabla PostgreSQL ascendente por un campo de fecha/hora, p. last_updated.PostgreSQL ordenar por fecha y hora asc, null primero?

Pero ese campo se le permite estar vacía o nula y quiero registros con nulo en last_updated vienen anteslast_updated no nulo.
¿Esto es posible?

order by last_updated asc /* and null last_updated records first ?? */ 
+0

por si acaso necesario: http://www.postgresql.org/docs/9.0/static/queries-order.html – mhd

Respuesta

106

PostgreSQL proporciona los NULLS FIRST | LAST palabras clave para la cláusula ORDER BY para atender a esa necesidad exactamente:

... ORDER BY last_updated NULLS FIRST 

Un típica caso uso es con orden de clasificación descendente (DESC), que produce la inversión completa de la orden ascendente predeterminada (ASC) con valores nulos primero. A menudo no es deseable - por lo que, para mantener los valores nulos última:

... ORDER BY last_updated DESC NULLS LAST 

Para apoyar la consulta con un índice, hágale:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST); 

Postgres puede leer btree índices hacia atrás, pero que importa donde se añaden los valores NULL.

+1

no encontré eso antes, mi google-fu no es tan bueno. Tnx – mhd

+1

@mhd ¿No usaste Google para "postgres sort null first"? –

+9

Lo hice. Así es como obtuve esta página :) – ibrewster

8

Puede crear un ORDER BY personalizado utilizando una instrucción CASE.
La instrucción CASE verifica su condición y asigna a las filas que cumplen con esa condición un valor inferior al asignado a las filas que no cumplen la condición.
es probable que sea más fácil de entender dado un ejemplo:

SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
     last_updated ASC; 
+1

Además, pero probablemente sepa esto, 'ASC' es el orden de clasificación predeterminado para que no lo haga necesariamente necesito escribirlo. – bernie

+2

Esa es una forma bastante complicada de escribir 'NULLS FIRST' ... –

+0

De acuerdo. También es una forma compatible con ANSI de escribir 'NULLS FIRST'. – bernie

Cuestiones relacionadas