2010-11-08 24 views
6

Parece que en PostgreSQL, empty_field != 1 (o algún otro valor) es FALSE. Si esto es cierto, ¿alguien me puede decir cómo comparar con campos vacíos?Postgresql y comparando con un campo vacío

He siguiente consulta, que se traduce en "seleccionar todos los mensajes de grupo de usuarios para los que no ha votado todavía:.

SELECT p.id, p.body, p.author_id, p.created_at 
FROM posts p 
LEFT OUTER JOIN votes v ON v.post_id = p.id 
WHERE p.group_id = 1 
AND v.user_id != 1 

y se da salida a la nada, a pesar de que califican tabla está vacía Tal vez hay algo malo en mi consulta y no con la lógica anterior

Editar:? parece que el cambio de v.user_id != 1, a v.user_id IS DISTINCT FROM 1, hizo el trabajo a partir de documentos de PostgreSQL:.

Para entradas no nulas, IS DISTINCT FROM es lo mismo que el operador <>. Sin embargo, cuando ambas entradas son nulas, devolverá falso, y cuando solo una entrada es nula, devolverá verdadero.

+0

Posible duplicar con varias otras preguntas, por ejemplo, http://stackoverflow.com/q/1833949/141081, http://stackoverflow.com/q/3777230/141081, ... – Dirk

Respuesta

4

Si desea devolver las filas donde v.user_id es NULL, debe manejarlo especialmente. Una manera de solucionarlo es escribir:

AND COALESCE(v.user_id, 0) != 1 

Otra opción es:

AND (v.user_id != 1 OR v.user_id IS NULL) 

Edición: spacemonkey es correcto que en PostgreSQL se debe utilizar IS DISTINCT FROM aquí.

+0

parece que ES DISTINTO DE hizo el trabajo también – spacemonkey

+1

@spacemonkey: tienes razón. Esa es en realidad una mejor forma de hacerlo en PostgreSQL. Lo pasé por alto completamente. –

1

NULL es un valor desconocido por lo que nunca puede igualar algo. Examine el uso de la función COALESCE.

Cuestiones relacionadas