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

Руководство по функции POWER для возведения в степень в MS SQL
Раздел: Математические функции, Математические
POWER(numeric_expression, power): Same as input

Функция POWER в MS SQL Server

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

Синтаксис функции: POWER ( expression, power )

  • expression – числовое выражение, которое возводится в степень. Может быть любого типа данных, за исключением типов bit. Это основание.
  • power – числовое выражение, определяющее степень, в которую возводится основание. Может быть любого типа данных, за исключением типов bit. Это показатель степени.

Возвращаемый тип данных определяется типом входного аргумента expression. В большинстве случаев, если expression имеет тип float или real, возвращается float. Для других числовых типов (decimal, int, numeric, money, smallmoney, smallint, tinyint, bigint) возвращаемый тип рассчитывается по правилам неявного преобразования типов с приоритетом.

Функция возвращает NULL, если любой из аргументов равен NULL.

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

Возведение положительного числа в степень:

SELECT POWER(2, 3) AS Result;
Result
-------
8

Возведение в дробную степень (извлечение корня):

SELECT POWER(27, 1.0/3) AS CubeRoot;
CubeRoot
--------
3.0

Использование с отрицательным основанием и целой степенью:

SELECT POWER(-2, 3) AS Result;
Result
-------
-8

Возведение в нулевую степень всегда дает 1:

SELECT POWER(5, 0) AS Result, POWER(0, 0) AS Result2;
Result      Result2
-------     -------
1           1

Возведение нуля в положительную степень:

SELECT POWER(0, 5) AS Result;
Result
-------
0

Работа с десятичными типами данных:

SELECT POWER(CAST(1.5 AS DECIMAL(5,2)), 4) AS Result;
Result
----------
5.062500

Альтернативные функции в MS SQL

  • SQRT ( expression ) – специализированная функция для вычисления квадратного корня числа. Она эквивалентна POWER(expression, 0.5), но может быть более читаемой для этой конкретной операции.
  • SQUARE ( expression ) – функция для возведения числа в квадрат. Эквивалентна POWER(expression, 2). Ее использование делает код более явным при вычислении квадрата значения.
  • EXP ( float_expression ) – функция для вычисления экспоненты (e в степени указанного числа). Для возведения числа e в степень предпочтительнее использовать EXP, а не POWER(2.71828182845905, power).
  • LOG ( float_expression [, base ] ) – функция, обратная POWER. Вычисляет логарифм числа. Если нужен натуральный логарифм или логарифм по другому основанию, используют эту функцию.

Выбор между POWER, SQRT и SQUARE часто зависит от ясности кода. Для квадратов и квадратных корней специализированные функции понятнее. POWER универсальна и подходит для любой степени.

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

Ошибка арифметического переполнения: При работе с целыми типами и большими степенями может произойти переполнение.

SELECT POWER(10, 10) AS Result; -- INT переполнение
Msg 8115, Level 16, State 2...
Arithmetic overflow error converting expression to data type int.

Решение – использовать типы с большей емкостью или десятичные типы:

SELECT POWER(CAST(10 AS BIGINT), 10) AS Result;
SELECT POWER(10.0, 10) AS Result;
Result
-----------
10000000000
-----------
10000000000.0

Возведение отрицательного числа в дробную степень: Попытка вычислить четный корень из отрицательного числа приводит к ошибке домена, так как результат не является вещественным числом.

SELECT POWER(-4, 1.0/2) AS Result; -- Квадратный корень из -4
Msg 3623, Level 16, State 1...
An invalid floating point operation occurred.

Неявное преобразование типов: Важно контролировать типы данных, чтобы избежать неожиданного округления или ошибок.

SELECT POWER(9, 1/2); -- 1/2 для целых чисел = 0
Result
-------
1.0

Правильно:

SELECT POWER(9, 1.0/2);
Result
--------
3.0

История изменений функции

Функция POWER присутствует в SQL Server с ранних версий, и ее основная логика работы не претерпела значительных изменений.

В современных версиях SQL Server (начиная с SQL Server 2008 и далее) изменения касались в основном интеграции с другими компонентами, такими как увеличение производительности при работе с типами данных decimal и float в рамках общего развития ядра СУБД. Специфических новых аргументов или флагов для функции POWER не добавлялось.

Ключевой момент для разработчика – функция стабильна и ее поведение согласовано во всех актуальных поддерживаемых версиях SQL Server.

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

Вычисление сложного процента: Формула A = P * (1 + r/n)^(nt).

Пример sql
DECLARE @Principal DECIMAL(10,2) = 1000.00;
DECLARE @Rate FLOAT = 0.05;
DECLARE @TimesCompounded INT = 12;
DECLARE @Years INT = 5;

SELECT
    @Principal * POWER(1 + @Rate / @TimesCompounded, @TimesCompounded * @Years)
    AS FutureValue;
FutureValue
-------------------
1283.35867875501

Генерация геометрической прогрессии:

Пример sql
WITH Numbers AS (
    SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
)
SELECT n, POWER(2, n) AS GeometricSeq FROM Numbers;
n   GeometricSeq
--- ------------
0   1
1   2
2   4
3   8

Проверка на четность через возведение (-1) в степень:

Пример sql
SELECT
    number,
    CASE POWER(-1, number)
        WHEN 1 THEN 'Четное'
        WHEN -1 THEN 'Нечетное'
    END AS Parity
FROM (VALUES (1), (2), (3), (4)) AS T(number);
number  Parity
------  ----------
1       Нечетное
2       Четное
3       Нечетное
4       Четное

Вычисление длины гипотенузы (теорема Пифагора):

Пример sql
DECLARE @a FLOAT = 3, @b FLOAT = 4;
SELECT SQRT(POWER(@a, 2) + POWER(@b, 2)) AS Hypotenuse;
-- Или с SQUARE
SELECT SQRT(SQUARE(@a) + SQUARE(@b)) AS Hypotenuse;
Hypotenuse
----------
5.0

Округление до заданного разряда с использованием степеней 10:

Пример sql
DECLARE @Value FLOAT = 123.456789;
DECLARE @Decimals INT = 2;
SELECT ROUND(@Value, @Decimals) AS Rounded,
       ROUND(@Value * POWER(10, @Decimals), 0) / POWER(10, @Decimals) AS RoundedManual;
Rounded           RoundedManual
----------------  -------------
123.460000000000  123.46

Работа в оконных функциях для расчета накопленного роста:

Пример sql
WITH MonthlyGrowth AS (
    SELECT 1 AS Month, 1.02 AS GrowthFactor UNION ALL
    SELECT 2, 1.05 UNION ALL
    SELECT 3, 0.98
)
SELECT
    Month,
    GrowthFactor,
    EXP(SUM(LOG(GrowthFactor)) OVER (ORDER BY Month)) AS CumulativeProduct,
    -- Альтернатива через POWER и произведение не применима напрямую,
    -- этот пример показывает связь POWER/LOG.
    LOG(GrowthFactor) AS LnGrowth
FROM MonthlyGrowth;
Month GrowthFactor CumulativeProduct   LnGrowth
----- ------------- -----------------   ---------
1     1.02          1.02                0.019802...
2     1.05          1.071               0.048790...
3     0.98          1.04958            -0.020202...

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

MySQL: Используется функция POWER(x, y) или оператор POW(x, y). Синтаксис и поведение идентичны SQL Server.

SELECT POW(2, 8);
256

Oracle: Функция POWER(x, y). Имеет аналогичное поведение. Также есть функция EXP для экспоненты.

SELECT POWER(10, 2) FROM DUAL;
100

PostgreSQL: Функция POWER(x, y). Также поддерживает оператор ^ для возведения в степень (например, 2.0 ^ 3.0).

SELECT POWER(5, 3), 5.0 ^ 3.0;
power | ?column?
------+----------
  125 |      125

SQLite: Встроенной функции POWER нет. Используется функция pow(x, y) из модуля math, доступного через расширения, или пишется пользовательская функция. Часто вычисления производятся на стороне приложения.

Sybase ASE: Функция POWER(x, y) работает аналогично SQL Server.

Python: Используется оператор ** (x ** y) или встроенная функция pow(x, y).

print(2 ** 10)
print(pow(2, 10))
1024
1024

JavaScript: Используется метод Math.pow(x, y) или оператор ** (в ES2016 и новее).

console.log(Math.pow(3, 4));
console.log(3 ** 4);
81
81

MS SQL POWER function comments

En
POWER Returns the value of the specified expression to the specified power