ABS: примеры (SQL)

Работа с модулем числа: функция ABS в T-SQL
Раздел: Математические функции, Математические
ABS(numeric_expression): Same as input

Описание функции ABS

Функция ABS в MS SQL Server является математической функцией, предназначенной для возврата абсолютного значения указанного числового выражения. Абсолютное значение числа представляет собой его величину без учета знака, то есть всегда является неотрицательным числом или нулем.

Основное назначение и использование

Функция применяется в случаях, когда необходимо игнорировать знак числа. Типичные сценарии включают расчет разниц между значениями, обработку данных финансового характера, где важна разница, а не направление, или подготовку данных для дальнейших вычислений, требующих неотрицательных значений.

Аргументы и возвращаемые значения

Функция принимает один аргумент:

  • numeric_expression — числовое выражение точного или приблизительного числового типа данных. Допустимые типы: bigint, int, smallint, tinyint, decimal, numeric, float, real, money, smallmoney.

Возвращаемый тип данных соответствует типу входного аргумента. Для типов decimal и numeric возвращается значение с той же точностью и масштабом. ABS всегда возвращает неотрицательное значение или NULL, если входной аргумент был NULL.

Примеры использования

Простое применение с положительными и отрицательными числами разных типов.

SELECT ABS(123.45) AS AbsPositive, ABS(-987.65) AS AbsNegative;
AbsPositive   AbsNegative
------------  ------------
123.45        987.65

Использование с целыми числами и денежным типом.

SELECT ABS(-15) AS AbsInt, ABS($-125.78) AS AbsMoney;
AbsInt        AbsMoney
------        ---------
15            125.78

Обработка нулевого и NULL значения.

SELECT ABS(0) AS AbsZero, ABS(NULL) AS AbsNull;
AbsZero       AbsNull
------        --------
0             NULL

Похожие функции в MS SQL

Прямых аналогов функции ABS для получения абсолютного значения в T-SQL нет. Однако, для реализации схожей логики иногда применяются другие математические или условные конструкции.

  • SIGN — возвращает знак числа: -1, 0 или 1. Может использоваться в комбинации с умножением для получения абсолютного значения (число * SIGN(число)), но это неэффективно и избыточно по сравнению с ABS.
  • CASE — условный оператор позволяет создать пользовательскую логику для возврата абсолютного значения: CASE WHEN число < 0 THEN -число ELSE число END. Использование ABS предпочтительнее из-за простоты и производительности.

Функция ABS является наиболее оптимальным и читаемым выбором для получения модуля числа.

Типичные ошибки

Ошибки при работе с функцией ABS чаще всего связаны с передачей аргументов нечислового типа или с неявным переполнением.

1. Передача строкового аргумента

SELECT ABS('не число');
Сообщение об ошибке:
Msg 8114, Level 16, State 5...
Ошибка при преобразовании типа данных varchar к numeric.

2. Попытка получить абсолютное значение минимального целого числа

-- Для типа TINYINT минимальное значение -0, поэтому ошибки не будет.
-- Для INT минимальное значение -2147483648, ABS которого равно 2147483648,
-- что выходит за пределы диапазона INT.
DECLARE @minInt INT = -2147483648;
SELECT ABS(@minInt);
Сообщение об ошибке:
Msg 8115, Level 16, State 2...
Арифметическое переполнение.

Чтобы избежать этой ошибки, можно использовать тип данных с большим диапазоном, например, BIGINT.

Изменения в последних версиях

Функция ABS является одной из базовых математических функций. Ее поведение, синтаксис и поддерживаемые типы данных оставались стабильными и неизменными на протяжении многих версий MS SQL Server, включая SQL Server 2012, 2014, 2016, 2017, 2019 и 2022. Значительных изменений или улучшений в последних выпусках не зафиксировано.

Расширенные примеры

1. Использование ABS в вычислениях для нахождения разницы между значениями без учета знака.

Пример sql
-- Расчет абсолютной разницы между двумя ценами
DECLARE @PriceA DECIMAL(10,2) = 99.99, @PriceB DECIMAL(10,2) = 149.50;
SELECT ABS(@PriceA - @PriceB) AS PriceDifference;
PriceDifference
---------------
49.51

2. Применение в условии WHERE для фильтрации записей, где отклонение превышает порог.

Пример sql
-- Найти товары, у которых отклонение цены от эталонной (100) больше 20.
-- (Используется демонстрационная таблица)
WITH SampleData (ProductID, Price) AS (
    SELECT 1, 85.00 UNION ALL
    SELECT 2, 120.50 UNION ALL
    SELECT 3, 77.00 UNION ALL
    SELECT 4, 135.00
)
SELECT ProductID, Price FROM SampleData
WHERE ABS(Price - 100) > 20;
ProductID    Price
---------    -----
3            77.00
4            135.00

3. Комбинирование с агрегатными функциями.

Пример sql
-- Найти среднее абсолютное значение отклонений от нуля в наборе данных.
SELECT AVG(ABS(Deviation)) AS AvgAbsoluteDeviation
FROM (VALUES (-5), (3), (-12), (7), (0)) AS T(Deviation);
AvgAbsoluteDeviation
--------------------
5.4

4. Использование в оконных функциях для анализа последовательностей.

Пример sql
-- Расчет абсолютного изменения значения от строки к строке.
WITH SalesData AS (
    SELECT 1 AS Period, 1500 AS Revenue UNION ALL
    SELECT 2, 1300 UNION ALL
    SELECT 3, 1650
)
SELECT Period, Revenue,
       ABS(Revenue - LAG(Revenue, 1, Revenue) OVER (ORDER BY Period)) AS AbsChangeFromPrevious
FROM SalesData;
Period   Revenue   AbsChangeFromPrevious
------   -------   ---------------------
1        1500      0
2        1300      200
3        1650      350

Аналоги в других СУБД и языках

Концепция функции абсолютного значения является стандартной и присутствует практически во всех языках программирования и СУБД, хотя синтаксис может незначительно отличаться.

MySQL, PostgreSQL, SQLite

-- Пример для MySQL/PostgreSQL/SQLite
SELECT ABS(-42.3);
ABS(-42.3)
---------
42.3

Oracle

-- Пример для Oracle
SELECT ABS(-100) FROM dual;
ABS(-100)
---------
100

Python

# Встроенная функция abs()
result = abs(-15.7)
print(result)  # 15.7
15.7

JavaScript

// Глобальный метод Math.abs()
console.log(Math.abs(-7.25)); // 7.25
7.25

Семантика и поведение функции во всех перечисленных системах идентичны функции ABS в MS SQL. Основное отличие может заключаться в поддержке типов данных, специфичных для каждой платформы.

MS SQL ABS function comments

En
ABS Returns the absolute (positive) value of a numeric expression