Skip to content

NULL

NULL 非常特殊,他在 SQL 中表示缺失或未知数据。它不是空字符串、0 或任何其他具体值,而是一个状态标识,用于描述数据的三种情况:

  • 缺失数据(如未填写的用户年龄字段)
  • 未知数据(如无法确定的订单来源)
  • 未适用数据(如“配偶姓名”字段对未婚用户无意义)

作为未知数据,是任何数据类型的未知数据。因此他有一个很重要的特性就是NULL 兼容任何数据类型,尽管他和任何数据类型操作的结果通常依然是 NULL。

NULL 相关操作

NULL 判断

NULL 不能使用比较运算符来判断,必须使用 IS NULLIS NOT NULL

聚合函数影响

函数 行为
COUNT(*) 统计所有行(包括 NULL 行)
COUNT(col) 忽略 NULL 值,仅统计非 NULL 行
SUM()/AVG() 自动忽略 NULL 值
MAX()/MIN() 忽略 NULL,但若全为 NULL 则返回 NULL

巧用 COALESCE 处理 NULL 数据

COALESCE(value1, value2, ... valueN) 接收多个参数,返回其中第一个非 NULL 值。我们可以在最后添加一个 0、'' 这样的值来作为默认值达到转换 NULL 为其他值的效果:

SQL
-- 连接字符串,保证 type1 不会为 NULL
SELECT COALESCE(type1, '') || ';' || COALESCE(type2, '') || ';' || COALESCE(type3, '') AS combined_types FROM table;

使用 NULLIF 来转换其他值到 NULL

当我们要转换为数据类型时需要保证两个数据类型时兼容的,例如 "2021-10-1" 到 DATE 时没有问题的,但是 "" 到 DATE 就有问题。因此我们就可以将 "" 转换为 NULL 来兼容 DATE。此时就需要用到 NULLIF(expr1, expr2) 函数,他在 expr1 == expr2 时返回 NULL 否则返回 expr1,这样我们可以转换特定值到 NULL 来实现数据兼容:

SQL
SELECT NULLIF(LEFT(date_string, 4), '')::int as year from table;

Tips

NULLIF 典型应用就是数据兼容,例如避免被除数为 0,提出一些 N/A "" 这样的特殊 NULL 值等。他很多时候能够替代复杂的 CASE 语句。