Postgresql e di confronto per un campo vuoto

Sembra che in PostgreSQL, empty_field != 1 (o altro valore) è FALSE. Se questo è vero, qualcuno può dirmi come confrontare con i campi vuoti?

Ho la seguente query, che traduce “per selezionare tutti i messaggi in un gruppo di utenti per cui uno non ha votato ancora:

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

e uscite di niente, anche se voti tabella è vuota. Forse c’è qualcosa di sbagliato con la mia query e non con la logica di cui sopra?

Edit: sembra che la modifica v.user_id != 1, per v.user_id IS DISTINCT FROM 1, ha fatto il lavoro.
Da PostgreSQL:

Per i non-null ingressi, È DISTINTO DA
è lo stesso come il <> operatore.
Tuttavia, quando entrambi gli ingressi sono null it
restituisce false, e quando solo uno
in ingresso è null restituisce true.

Possibile duplicare con varie altre domande, ad esempio, stackoverflow.com/q/1833949/141081, stackoverflow.com/q/3777230/141081, …

OriginaleL’autore spacemonkey | 2010-11-08

2 Replies
  1. 4

    Se si desidera restituire righe in cui v. user_id è NULL, allora avete bisogno per gestire in modo speciale. Un modo per risolvere il problema è di scrivere:

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

    Un’altra opzione è:

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

    Modifica: spacemonkey è corretto che in PostgreSQL si dovrebbe usare IS DISTINCT FROM qui.

    sembra che È diverso DAL non troppo
    Hai ragione. Che in realtà è un modo migliore per farlo in PostgreSQL. Ho completamente trascurato.

    OriginaleL’autore Mark Byers

  2. 2

    NULL è un valore sconosciuto perciò non è mai uguale a qualcosa. Considerare la funzione COALESCE.

    OriginaleL’autore Kuberchaun

Lascia un commento