2010-08-21 4 views
185

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

Мой запрос выглядит следующим образом:

SELECT pid FROM planets WHERE userid = NULL 

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

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

+1

У MyISAM нет проблем с сохранением нулевого значения. Семантика самих NULL должна быть независимой от движка. – MarkR

ответ

396

SQL NULL СПЕЦИАЛЬНЫЙ, и вы должны сделать WHERE field IS NULL, поскольку NULL не может быть равно ни к чему,

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

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

+22

Неизвестно - Не ложно. SQL использует трехзначную логику. –

+36

NULL = NULL на самом деле не ЛОЖНО - снова NULL.Но это тоже не ИСТИНА, поэтому IF (NULL = NULL) не будет выполняться. – Konerak

+0

см. Также @obe ответ: SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 – Thomas

45
SELECT pid FROM planets WHERE userid IS NULL 
7

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

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

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

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

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

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

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

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

SELECT pid FROM planets WHERE userid IS NULL 
+0

Спасибо, Minhas очень полезно – webblover

+0

very usefull ... thanx – deemi

28

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

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

SELECT pid FROM planets WHERE userid = NULL; 

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

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

Emphasis mine.

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

Solution

SELECT pid FROM planets WHERE userid IS NULL; 

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

0

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

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

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

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

Если это сработало для вас, то по умолчанию для вашего varchar (1) есть значение '', а не null, поэтому не имеет отношения к этому вопросу. –

5

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

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

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

Ходили с:

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

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

Смежные вопросы