处理 NULL

已完成

NULL 值表示“无值”或“未知”。 不是指零或空白,也不表示空字符串。 这些值并不是未知。 NULL 值可用于表示尚未提供的值,例如客户尚未提供电子邮件地址时。 如前文所述,当某个值与目标数据类型不兼容时,一些转换函数也可能返回 NULL 值。

要处理 NULL,通常需要采取特殊的步骤。 NULL 实际上是非值。 它是未知的。 不等于任何内容,也等于任何内容。 NULL 不大于或小于任何内容。 对于它是什么,我们一无所解,但有时我们需要处理 NULL 值。 令人欣慰的是,T-SQL 提供用于转换或替换 NULL 值的函数。

ISNULL

COUNTX 函数有两个参数。 第一个是我们要测试的表达式。 如果第一个参数为 NULL,则该函数将返回第二个参数。 如果第一个表达式不是 NULL,则返回不变的值。

例如,假设数据库中的 Sales.Customer 表包含一个允许 NULL 值的 MiddleName 列。 查询此表时,可以选择返回特定值(如“无”),而不是在结果中返回 NULL。

SELECT FirstName,
      ISNULL(MiddleName, 'None') AS MiddleIfAny,
      LastName
FROM Sales.Customer;

该查询的结果可能如下所示:

FirstName

MiddleIfAny

LastName

奥兰多

N.

Gee

Keith

Howard

Donna

F.

Gonzales

...

...

...

注意

替换 NULL 的值必须与要计算的表达式的数据类型相同。 在以上示例中,MiddleName 是 varchar 类型,因此替换值不能是数值。 此外,需要选择不会作为常规值在数据中显示的值。 有时,可能很难找到永远不会出现在数据中的值。

前面示例处理了源表中的 NULL 值,但可以对可能返回 NULL 的任何表达式使用 ISNULL,包括在 ISNULL 函数中嵌套 TRY_CONVERT 函数。

COALESCE

ISNULL 函数不是 ANSI 标准函数,因此你可能希望改为使用 COALESCE 函数。 COALESCE 稍微灵活一些,它可以采用可变数量的参数,每个参数都是一个表达式。 它将返回列表中第一个不为 NULL 的表达式。

如果只有两个参数,则 COALESCE 的行为与 ISNULL 类似。 但是,对于两个以上参数,COALESCE 可以用作使用 ISNULL 的多部分 CASE 表达式的替代项。

如果所有参数均为 NULL,则 COALESCE 返回 NULL。 所有表达式必须返回相同或兼容的数据类型。

语法如下:

SELECT COALESCE ( expression1, expression2, [ ,...n ] )

以下示例使用一个名为 HR.Wages 的虚构表,其中包括三列有关雇员每周收益的信息:每小时费率、每周工资和每单位销售的佣金。 但是,每个雇员只能接受一种付款方式。 对于每位雇员,三列中有一列会包含一个值,其他两列将为 NULL。 要确定支付给每位雇员的总金额,可以使用 COALESCE 仅返回在这三列中找到的非 null 值。

SELECT EmployeeID,
      COALESCE(HourlyRate * 40,
                WeeklySalary,
                Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;

结果可能如下所示:

EmployeeID

WeeklyEarnings

1

899.76

2

1001.00

3

1298.77

...

...

NULLIF

NULLIF 函数允许在某些条件下返回 NULL。 在数据清理等领域想要将空白或占位符字符替换为 NULL 时,该函数十分有用。

NULLIF 采用两个参数,如果它们等效,则返回 NULL。 如果它们不相等,则 NULLIF 将返回第一个参数。

在此示例中,NULLIF 将折扣 0 替换成了 NULL。 如果折扣值不是 0,则返回该折扣值:

SELECT SalesOrderID,
      ProductID,
      UnitPrice,
      NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;

结果可能如下所示:

销售订单 ID

ProductID

单价

折扣

71774

836

356.898

Null

71780

988

112.998

0.4

71781

748

818.7

Null

71781

985

112.998

0.4

...

...

...

...