2016-05-02 4 views
1

У меня есть таблица mysql с нулевым столбцом int с именем «status», и у меня есть две записи в таблице, где один из состояний равен 2, когда другой имеет значение NULL , но когда я выбираю записи с запросом 'status! = 2', запись (status = null) не отображается.Mysql не может выбрать запись в таблице

mysql> 
mysql> 
mysql> desc admin_user; 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| acct_name | varchar(32)  | YES |  | NULL |    | 
| password | varchar(32)  | YES |  | NULL |    | 
| user_name | varchar(32)  | YES |  | NULL |    | 
| description | varchar(128)  | YES |  | NULL |    | 
| status  | int(11)   | YES |  | NULL |    | 
| role  | int(11)   | NO |  | 1  |    | 
| create_date | date    | YES |  | NULL |    | 
| update_date | date    | YES |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 
9 rows in set (0.00 sec) 

mysql> select id, acct_name, status from admin_user; 
+----+-----------+--------+ 
| id | acct_name | status | 
+----+-----------+--------+ 
| 1 | letme  | NULL | 
| 3 | admin  |  2 | 
+----+-----------+--------+ 
2 rows in set (0.00 sec) 

mysql> select id, acct_name, status from admin_user where status=2; 
+----+-----------+--------+ 
| id | acct_name | status | 
+----+-----------+--------+ 
| 3 | admin  |  2 | 
+----+-----------+--------+ 
1 row in set (0.00 sec) 

mysql> select id, acct_name, status from admin_user where status IS NULL; 
+----+-----------+--------+ 
| id | acct_name | status | 
+----+-----------+--------+ 
| 1 | letme  | NULL | 
+----+-----------+--------+ 
1 row in set (0.00 sec) 

mysql> select id, acct_name, status from admin_user where status!=2; 
Empty set (0.00 sec) 

mysql> 

Как вы можете видеть, запись которого статус NULL не может быть выбран с помощью запроса «статус! = 2». Я также пробовал 'статус <> 2'. Может ли кто-нибудь помочь?

+0

Попробуйте 'COALESCE (статус, 0)! = 2';). –

+0

Да, это работает. Благодарю. – jinshui

ответ

3

Nulls действительно interesting.

Значение NULL может быть неожиданным, пока вы не привыкнете к нему. Концептуально, NULL означает «недостающее неизвестное значение» и обрабатывается несколько иначе, чем другие значения.

Более

Вы не можете использовать арифметические операторы сравнения, такие как =, < или <> в тест на NULL

Есть много разных способов, чтобы написать это. Один из них:

select id, acct_name, status from admin_user where status IS NULL 
    OR status != 2 

Всеобъемлющее как предлагалось @ shA.t.

select id, acct_name, status from table1 where COALESCE(status, 0) != 2 

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

+1

NULL похож на NaN в мире SQL. Это может быть довольно странно, если вы не знаете, как это работает. – tadman

+0

Спасибо всем, Null действительно странный в мире SQL! – jinshui

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