SQL (MariaDB) NULL 值被忽略

SQL (MariaDB) NULL value is ignored

在 MariaDB 的客户端 mycli 我正在尝试 SELECTvend_countryNULLMI 的项目所以我写了这个简单的查询:

SELECT * 
FROM vendors
WHERE vend_state IN (NULL,'MI');

我得到了这个输出:

+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

这很奇怪,因为它似乎缺少在同一 table 中找到的具有 NULL 值的行。此查询演示了这一点:

SELECT * 
FROM vendors;

输出清楚地显示了两行空值,应该在第一个查询中输出:

+-----------+----------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name      | vend_address    | vend_city   | vend_state   | vend_zip   | vend_country   |
|-----------+----------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us    | 123 Main Street | Southfield  | MI           | 48075      | USA            |
|      1002 | LT Supplies    | 500 Park Street | Anytown     | OH           | 44333      | USA            |
|      1003 | ACME           | 555 High Street | Los Angeles | CA           | 90046      | USA            |
|      1004 | Furball Inc.   | 1000 5th Avenue | New York    | NY           | 11111      | USA            |
|      1005 | Jet Set        | 42 Galaxy Road  | London      | <null>       | N16 6PS    | England        |
|      1006 | Jouets Et Ours | 1 Rue Amusement | Paris       | <null>       | 45678      | France         |
+-----------+----------------+-----------------+-------------+--------------+------------+----------------+

我还尝试了一些其他查询,这些查询也忽略了具有 NULL 值的行:

mariadb root@localhost:crashcourse>  SELECT * 
                                 ->  FROM vendors
                                 ->  WHERE vend_state IN ('<null>','MI');
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+


mariadb root@localhost:crashcourse>  SELECT * 
                                 ->  FROM vendors
                                 ->  WHERE vend_state IN ('NULL','MI');
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   |   vend_zip | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           |      48075 | USA            |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

另一方面,这完全可以正常工作,因此 IN 关键字必须有效:

SELECT * 
FROM vendors
WHERE vend_id IN (1001,1005);

+-----------+-------------+-----------------+-------------+--------------+------------+----------------+
|   vend_id | vend_name   | vend_address    | vend_city   | vend_state   | vend_zip   | vend_country   |
|-----------+-------------+-----------------+-------------+--------------+------------+----------------|
|      1001 | Anvils R Us | 123 Main Street | Southfield  | MI           | 48075      | USA            |
|      1005 | Jet Set     | 42 Galaxy Road  | London      | <null>       | N16 6PS    | England        |
+-----------+-------------+-----------------+-------------+--------------+------------+----------------+

谁能告诉我,如何使用 IN 关键字搜索 NULL 值?

您不能以这种方式与 NULL 进行比较。您需要进行明确的单独比较:

SELECT * 
FROM vendors
WHERE vend_state IS NULL OR vend_state = 'MI';

你不能像 IN() 那样使用 NULL

您的两个选择是:

分离您的 NULL 过滤器:

SELECT * 
FROM vendors
WHERE vend_state IN ('MI','etc')
OR vend_state IS NULL;

或使用ISNULL()

SELECT * 
FROM vendors
WHERE ISNULL(vend_state,'XX') IN ('XX','MI');