SQL ABS 函数

SQL Server ABS 函数是一个数学函数,它返回指定数字表达式的绝对正值。简而言之,它将数据库表中的负数更改或转换为正数。在分析数据时,当数字的幅度比符号更重要时,它非常有用。

例如,如果你需要将所有负值转换为正值,并将零和正值保持不变(不修改),请使用 SQL ABS() 函数。由于这个出色的特性,你可以使用 ABS() 函数来计算两点之间的差值、距离、温度和其他统计计算。此函数接受任何数字数据类型,例如 INT、FLOAT、DECIMAL、MONEY 等。

SQL ABS 函数语法

ABS 函数用于查找绝对值的语法是:

SELECT ABS (Numeric_Expression)
FROM [Source]

SQL Server ABS 函数示例

我们也可以使用 WHERE 子句来定义过滤数据的条件。以下是使用 ABS() 函数时需要记住的一些要点。

  • 如果 Numeric_Expression 是负数,则返回等效的正值。
  • 如果它是正数或零,则返回相同的值(不修改)。
  • 如果数字值为 NULL,ABS() 函数将返回 NULL 值。
  • 返回值的数据类型与给定的数字表达式相同。

注意:虽然有些人认为 ABS 和 SIGN 函数相同,但它们之间存在重大区别。SIGN() 函数返回负数、零和正数的 -1、0 和 1。而 ABS() 函数将负数转换为正数,关注的是其绝对值。

SQL Server ABS 函数示例

ABS 函数返回任何数字值或数字的绝对正值。以下 数学函数 查询将展示使用 ABS 函数的多种方法。

下面的 SELECT 语句直接对正值应用 ABS() 函数。

SELECT ABS(27) AS PosVal

输出

PosVal
------
27

下面的语句查找负数的绝对正值。

SELECT ABS(-27) AS NegVal

输出

NegVal
-------
27

在此 SQL Server 语句中,我们使用零作为参数。众所周知,它会返回零。

SELECT ABS(0) AS Zero;

结果

Zero
----
0

除了上述方法,我们还可以通过传递数学表达式来使用 SQL ABS() 函数。例如,下面的代码使用多个值并执行加法和减法。接下来,函数返回最终值的正数。

SELECT ABS(2 + 55 - 77) AS MathCal

它计算 (2 + 55 – 77) = -20。-20 的绝对正值是 20。

MathCal
-----
20

下面的查询展示了如何使用 ABS() 函数查找浮点值的绝对正值。

SELECT ABS(-7.88) AS DecVal

结果

DecVal
----
7.88

这里,我们使用 ABS 函数查找变量 @i 的绝对值。这意味着 ABS(-250.89765) 并使用 ALIAS 列为其分配一个新名称“Absolute Value”。

DECLARE @i INT
SET @i = -250.89765

SELECT ABS(@i) AS [Absolute Value]

输出

250

除了上述选项,您还可以将此函数用于变量。这里,我们声明了一个 INTEGER 类型的变量 @i,并使用 ABS 函数查找其绝对值。接下来,我们应用 ROUND() 将小数精度截断到 3。

DECLARE @i FLOAT
SET @i = -250.89765

SELECT ROUND(ABS(@i), 3) AS [Absolute Value]

输出

Absolute Value
------
250.898

提示:如果用 INT 替换 FLOAT 数据类型并将值保留为 -250.89765,则输出将被转换为整数并返回 250。

NULL 值示例

正如我们之前提到的,如果您将 NULL 作为参数值传递,SQL ABS() 函数将在结果集中返回 NULL。

SELECT ABS(NULL) AS NL

SELECT ABS(NULL + 50) AS NL2

结果

NULL

NULL

第二个语句也返回 NULL,因为任何加到 NULL 的值也是 NULL。有关更多信息,请参考 算术运算符。要处理 NULL 值,请使用 COALESCE 函数

字符串值示例

如果我们传递用 ‘ ‘ 括起来的任何信息,并且服务器可以将其隐式转换为数值,则 SQL Server ABS() 函数将返回给定值的正数。以下查询将字符串值转换为数字并返回绝对正值。

SELECT ABS('-10') AS txtNum

它将其视为数字并返回结果。

txtNum
----
10

如果您传递的字符串信息或文本无法转换为数字值,则会引发错误。例如,下面的代码会返回错误。

SELECT ABS('Tutorial') AS text

上述查询抛出的错误是:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to float.

表上的 SQL ABS 函数

ABS 函数还允许您查找列值的绝对值。想象一个表包含某些统计信息的正负数值,或者计算两列之间的绝对差值,请在它们上使用 ABS() 函数。为了演示这个例子,我们使用 AdventureWork2022 SalesTerritory 表数据。

在这里,我们将查找每个地区今年和去年销售额的常规差值和绝对差值。为此,我们将减法过程包装在 ABS() 函数中。

SELECT [TerritoryID],
[Name],
[Group],
[SalesYTD],
[SalesLastYear],
SalesYTD - SalesLastYear AS Diff,
ABS(SalesYTD - SalesLastYear) AS AbsoluteDiff
FROM [Sales].[SalesTerritory]
SQL ABS Function to find Absolute Positive Value

两点之间的距离

类似地,您可以组合使用 ABS、SQRTPOWER() 函数来查找两点之间的距离。为了使其简单易懂,我们使用了 salesperson 表来查找销售配额和实际达成的差值。

SELECT [BusinessEntityID]
,[SalesQuota]
,[SalesYTD]
,[SalesLastYear]
,[SalesYTD] - [SalesLastYear] AS SaleDiff
,SalesQuota -SalesYTD AS QDiff
,ABS(SQRT(POWER(SalesYTD - SalesQuota, 2))) AS AbsoluteDistance
FROM [Sales].[SalesPerson]

错误:算术溢出

在使用 SQL ABS() 函数时,您必须注意任何数字数据类型的上限和下限。因为当您尝试查找超出上限的任何数字的绝对值时,会发生算术溢出错误。

例如,有符号 TINYINT 的下限和上限分别是 -128 和 127。考虑这种情况:如果您尝试查找下限的绝对正值,即 -128,ABS() 函数将返回算术溢出错误。因为 TINYINT 的上限是 127,而 128 超出了该边界。

DECLARE @n TINYINT = -128
SELECT ABS(@n) AS RS

上述语句将抛出以下错误:

Msg 220, Level 16, State 2, Line 4
Arithmetic overflow error for data type tinyint, value = -128.