MySQL: выбор строк, где столбец равен null

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

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

SELECT pid FROM planets WHERE userid = NULL

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

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

8 ответов


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

включая себя (т. е.: NULL = NULL всегда false).

посмотреть Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


SELECT pid FROM planets WHERE userid IS NULL

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

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

SELECT pid FROM planets WHERE userid = NULL;

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

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

выделено мной.

поиск значений столбцов NULL, вы не можете использовать


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

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

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

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

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

5) невозможно проверить нулевые значения при сравнении операторы, например=,.

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

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

SELECT pid FROM planets WHERE userid IS NULL

есть еще <=> оператор:

SELECT pid FROM planets WHERE userid <=> NULL

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

SELECT NULL <=> NULL доходность 1.

SELECT 42 <=> 42 доходность 1 как хорошо.

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


была та же проблема, где запрос:

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

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

пошел с:

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

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


SELECT pid FROM planets WHERE userid is null;

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

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

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

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