2010-11-08 15 views
6

Es scheint, dass in PostgreSQL empty_field != 1 (oder ein anderer Wert) FALSE ist. Wenn das stimmt, kann mir jemand sagen, wie man mit leeren Feldern vergleicht?Postgresql und Vergleich mit einem leeren Feld

Ich habe folgende Abfrage, die alle Beiträge in Benutzer-Gruppe „wählen übersetzt, für die man noch nicht gestimmt.

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 

und es nichts gibt, obwohl Stimmen Tabelle leer Vielleicht etwas falsch mit meiner Abfrage da ist und nicht mit der Logik über

Edit:? es scheint, dass v.user_id != 1 Wechsel zu v.user_id IS DISTINCT FROM 1, hat den Job Von PostgreSQL-Dokumentation.

Bei Nicht-Null-Eingängen entspricht IS DISTINCT FROM dem <> -Operator. Wenn beide Eingaben jedoch null sind, gibt false zurück, und wenn nur eine Eingabe null ist, wird True zurückgegeben.

+0

Mögliche Duplikat mit verschiedenen anderen Fragen, zB http://Stackoverflow.com/q/1833949/141081, http://Stackoverflow.com/q/3777230/141081, ... – Dirk

Antwort

4

Wenn Sie Zeilen zurückgeben möchten, in denen v.user_id NULL ist, müssen Sie dies speziell behandeln. Eine Möglichkeit, kann es zu beheben ist, zu schreiben:

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

Eine weitere Option ist:

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

bearbeiten: Spacemonkey ist richtig, dass in PostgreSQL Sie IS DISTINCT FROM hier verwenden sollten.

+0

scheint es, dass IS DISTINCT FROM hat den Job auch gemacht – spacemonkey

+1

@spacemonkey: Du hast Recht. Das ist eigentlich eine bessere Möglichkeit, es in PostgreSQL zu tun. Ich habe es komplett übersehen. –

1

NULL ist ein unbekannter Wert, daher kann es niemals gleich sein. Untersuchen Sie die Verwendung der COALESCE-Funktion.

Verwandte Themen