SQL (MariaDB) NULL 值被忽略
SQL (MariaDB) NULL value is ignored
在 MariaDB 的客户端 mycli
我正在尝试 SELECT
值 vend_country
是 NULL
或 MI
的项目所以我写了这个简单的查询:
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');
在 MariaDB 的客户端 mycli
我正在尝试 SELECT
值 vend_country
是 NULL
或 MI
的项目所以我写了这个简单的查询:
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');