SQL NULL 函数

SQL COALESCE()、IFNULL()、ISNULL() 和 NVL() 函数

涉及 NULL 值的操作有时会导致意外结果。

SQL 提供了一些内置函数来处理 NULL 值,最常见的函数有:

  • COALESCE() - 推荐的标准函数。(适用于 MySQL、SQL Server 和 Oracle)
  • IFNULL() - (MySQL)
  • ISNULL() - (SQL Server)
  • NVL() - (Oracle)
  • IsNull() - (MS Access)

注意:NULL 值表示数据库字段中未知或缺失的数据。它本身不是一个值,而是指示数据缺失的占位符。

演示数据库

假设我们有以下 Products 表:

PId ProductName Price InStock InOrder
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23 null
3 Gorgonzola 15.67 9 20

"InOrder" 列是可选的,可能包含 NULL 值。

现在请看下面的 SQL 语句:

SELECT ProductName, Price * (InStock + InOrder)
FROM Products;

注意:在上面的 SQL 中,如果任何 InOrder 值为 NULL,结果将为 NULL!

COALESCE() 函数

COALESCE() 函数是处理潜在 NULL 值的推荐标准函数。

COALESCE() 函数返回值列表中的第一个非 NULL 值。

COALESCE() 函数适用于 MySQLSQL Server 和 Oracle(不适用于 MS Access)。

语法

COALESCE(val1, val2, ...., val_n)

这里我们使用 COALESCE() 函数将 NULL 值替换为 0

SELECT ProductName, Price * (InStock + COALESCE(InOrder, 0))
FROM Products;

IFNULL() 函数 (MySQL)

MySQL 的 IFNULL() 函数将 NULL 替换为指定的值。

语法

IFNULL(expr, alt)

这里我们将 NULL 值替换为 0

SELECT ProductName, Price * (InStock + IFNULL(InOrder, 0))
FROM Products;

ISNULL() 函数 (SQL Server)

SQL Server 的 ISNULL() 函数将 NULL 替换为指定的值。

语法

ISNULL(expr, alt)

这里我们将 NULL 值替换为 0

SELECT ProductName, Price * (InStock + ISNULL(InOrder, 0))
FROM Products;

NVL() 函数 (Oracle)

Oracle 的 NVL() 函数将 NULL 替换为指定的值。

语法

NVL(expr, alt)

这里我们将 NULL 值替换为 0

SELECT ProductName, Price * (InStock + NVL(InOrder, 0))
FROM Products;

IsNull() 函数 (MS Access)

MS Access 的 IsNull() 函数在表达式为 NULL 时返回 TRUE,否则返回 FALSE。

语法

IsNull(expr)

MS Access 的 IIf() 函数根据表达式的求值结果返回两部分之一。

语法

IIf(expr, truepart, falsepart)
  • expr - 必需。要计算的表达式
  • truepart - 如果 expr 为 True 时返回的值
  • falsepart - 如果 expr 为 False 时返回的值

这里我们将 NULL 值替换为 0

SELECT ProductName, Price * (InStock + IIf(IsNull(InOrder), 0, InOrder))
FROM Products;