首页 > 解决方案 > 何时使用 WHERE c.column = null 的 SQL 子句?

问题描述

我花了相当多的时间来理解支持 null 和 SQL 标准的语言的不匹配,其中 c.col = null 返回 0 行,即使 c.col 中有包含 null 的行。我开始想知道在什么用例中有人想在 SQL 的 where 子句中使用 c.col = null。

如果我在 WHERE c.col 为空时,我确实清楚地知道了这一点,我会返回 c.col 包含空值的行。这引出了一个问题,c.col = null 必须有一个用途和理由才能具有不同的行为。应该是有人用的吧?然后我很好奇我们什么时候这样做的背景?

(我看到很多人(包括我在内)认为在 SQL 中 WHERE c.col=null 会导致所有行在列 col 中都为空)。但是,我也意识到有些上下文我不知道,并且对有人可能会执行 c.col = null 的上下文感到好奇。

谢谢,院长

标签: mysqlsqlpostgresql

解决方案


NULL是一个特殊值,表示没有值。使用运算符将​​列与 NULL 进行比较=是未定义的。

相反,您应该使用is来获取具有NULL以下值的列

select *
from yourTable
where columnName is null

例如,假设您有下表customer,并且您想查找未由具有 referee_id 的人推荐的名称2

| name | referee_id|
+------+-----------+
| Will |      NULL |
| Jane |      NULL |
| Alex |         2 |
| Bill |      NULL |
| Zack |         1 |
| Mark |         2 |

您的预期输出应该是

| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |

要使您的输出正确,您还需要考虑带有NULL值的 referee_id,因此您的查询应该是

select
    name
from customer
where referee_id <> 2
or referee_id is null

推荐阅读