MySQL: выбор строк с нулевым столбцом - PullRequest
239 голосов
/ 21 августа 2010

У меня проблема с тем, что когда я пытаюсь выбрать строки, которые имеют NULL для определенного столбца, он возвращает пустой набор.Тем не менее, когда я смотрю на таблицу в phpMyAdmin, для большинства строк она говорит о пустом.

Мой запрос выглядит примерно так:

SELECT pid FROM planets WHERE userid = NULL

Пустой набор каждый раз.

Во многих местах сказано, что он не хранится как «NULL» или «null» вместо фактического значения, и кто-то сказал, что пытается найти только пробел (userid = ' '), но ни одно из них не сработало.Было предложено не использовать MyISAM и использовать innoDB, потому что MyISAM имеет проблемы с хранением нулевого значения.Я переключил таблицу на innoDB, но теперь мне кажется, что проблема может заключаться в том, что она все еще не является нулевой из-за способа ее преобразования.Я хотел бы сделать это без необходимости воссоздания таблицы как innoDB или чего-либо еще, но если мне придется, я, безусловно, могу попробовать это.

Ответы [ 8 ]

473 голосов
/ 21 августа 2010

SQL NULL особенный, и вы должны сделать WHERE field IS NULL, так как NULL не может быть равен чему-либо,

включая себя (т. Е. NULL = NULL всегда ложно).

См. Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules

58 голосов
/ 21 августа 2010
SELECT pid FROM planets WHERE userid IS NULL
36 голосов
/ 23 ноября 2013

Поскольку всем даны ответы, я хочу добавить немного больше.Я также столкнулся с той же проблемой.

Почему ваш запрос не удался?

SELECT pid FROM planets WHERE userid = NULL;

Это не даст ожидаемого результата, поскольку с mysql doc

В SQL значение NULL равноникогда не имеет значения true по сравнению с любым другим значением, даже NULL. Выражение, содержащее NULL, всегда создает значение NULL, если иное не указано в документации для операторов и функций, участвующих в выражении.

Акцент мой.

Для поиска значений столбцов, которые NULL, нельзя использовать тест expr = NULL.Следующий оператор не возвращает строк, потому что expr = NULL никогда не имеет значения true для любого выражения

Решение

SELECT pid FROM planets WHERE userid IS NULL; 

Для проверки на NULL используйтеоператоры IS NULL и IS NOT NULL.

12 голосов
/ 13 июня 2016

Также есть оператор <=>:

SELECT pid FROM planets WHERE userid <=> NULL

Будет работать.Приятно то, что <=> также можно использовать со значениями, отличными от NULL:

SELECT NULL <=> NULL дает 1.

SELECT 42 <=> 42 также 1.

Смотрите здесь: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to

11 голосов
/ 18 октября 2013

Информация из http://w3schools.com/sql/sql_null_values.asp:

1) Значения NULL представляют пропущенные неизвестные данные.

2) По умолчанию столбец таблицы может содержать значения NULL.

3) значения NULL обрабатываются иначе, чем другие значения

4) Невозможно сравнить NULL и 0;они не эквивалентны.

5) Невозможно проверить значения NULL с помощью операторов сравнения, таких как =, <или <>.

6) Нам придется использоватьIS NULL и NOT NULL операторы вместо

Так что в случае вашей проблемы:

SELECT pid FROM planets WHERE userid IS NULL
8 голосов
/ 11 апреля 2017

Возникла та же проблема, когда запрос:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

не вернул никаких значений.Кажется, проблема с MyISAM, и тот же запрос к данным в InnoDB вернул ожидаемые результаты.

Отправлено с:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Возвращены все ожидаемые результаты.

2 голосов
/ 26 мая 2018
SELECT pid FROM planets WHERE userid is null;
0 голосов
/ 26 октября 2015

У меня была такая же проблема при преобразовании баз данных из Access в MySQL (используя vb.net для связи с базой данных).

Мне нужно было оценить, было ли поле (тип поля varchar (1)) нулевым.

Это утверждение сработало для моего сценария:

SELECT * FROM [table name] WHERE [field name] = ''
...