2010-05-13 20 views
12

Mi tabla tiene tres campos booleanos: f1, f2, f3. Si lo hagoSQL para clasificar la columna booleana como verdadera, nula, falsa

SELECT * FROM table ORDER BY f1, f2, f3 

los registros se ordenarán por estos campos en el orden falso, verdadero, nulo. Deseo ordenarlos con nulo entre verdadero y falso: el orden correcto debe ser verdadero, nulo, falso.

Estoy usando PostgreSQL.

Respuesta

19

No es hermosa, pero debería funcionar:

... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc 
+2

Obviamente tendrías que hacer lo mismo para cada una de las otras variables. –

+11

+1. Vamos a hacerlo más feo: 'ORDER BY COALESCE ((NO bool_field) :: INTEGER * 2, 1)'. :) – pilcrow

+0

ERROR: La función isnull (boolean) no existe – petehern

14

Una mejor solución sería utilizar

f1 DESC NULLS LAST

si estás de acuerdo con el orden verdadero, falso, nulo (supongo la parte importante de su pregunta era, como en mi situación actual, tener juntos los vaules no verdaderos)

https://stackoverflow.com/a/7621232/1627888

+0

Si bien esto es útil, no responde la pregunta, ya que hay casos en los que realmente quieres 'null' entre' true' y 'false'. – oulenz

2

que podría hacer también de la siguiente manera:

order by coalesce(f1, FALSE), coalesce(f1, TRUE), ... 

Si f1 es TRUE, se obtiene: TRUE, TRUE
Si f1 es NULL, se obtiene: FALSE, TRUE
Si f1 es FALSE, se obtiene: FALSE, FALSE

que corresponde al orden de clasificación que desea.

Cuestiones relacionadas