Postgresql и сравнение с пустым полем - PullRequest
6 голосов
/ 08 ноября 2010

Похоже, что в PostgreSQL empty_field != 1 (или какое-либо другое значение) равно FALSE .Если это правда, может кто-нибудь сказать мне, как сравнить с пустыми полями?

У меня есть следующий запрос, который переводится как «выбрать все сообщения в группе пользователей, за которые еще не проголосовали:

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

, и ничего не выводится, хотя голосов таблица пуста. Может быть, что-то не так с моим запросом, а не с логикой выше?

Редактировать: похоже, что изменение v.user_id != 1 на v.user_id IS DISTINCT FROM 1 сделалозадание. Из документации PostgreSQL:

Для ненулевых входных данных IS DISTINCT FROM аналогичен оператору <>. Однако, когда оба входных значения равны NULL, он возвращает falseВвод равен нулю, он вернет истину.

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

Если вы хотите вернуть строки, в которых v.user_id равен NULL, вам нужно обработать это специально. Один из способов исправить это - написать:

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

Другой вариант:

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

Edit : spacemonkey правильно, что в PostgreSQL вы должны использовать IS DISTINCT FROM здесь.

2 голосов
/ 08 ноября 2010

NULL - неизвестное значение, поэтому оно никогда не может равняться чему-либо. Изучите использование функции COALESCE.

...