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]

两点之间的距离
类似地,您可以组合使用 ABS、SQRT 和 POWER() 函数来查找两点之间的距离。为了使其简单易懂,我们使用了 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.