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() 函数适用于 MySQL、SQL 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;