Использование скалярных функций
Скалярные функции возвращают одно значение и обычно работают с одной строкой данных. Количество входных значений, которое они принимают может быть равно нулю (например, GETDATE) или единице (например, UPPER). Кроме того, возможно несколько значений (например, ROUND). Так как скалярные функции всегда возвращают одно значение, их можно использовать в любом расположении, где необходимо одно значение (результат). Чаще всего они используются в предложениях SELECT и предикатах предложения WHERE. Их также можно использовать в предложении SET инструкции UPDATE.
Встроенные скалярные функции можно объединить в различные категории, например, строковые функции, функции преобразования, логические, математические и другие. В этом модуле рассматриваются несколько распространенных скалярных функций.
При использовании скалярных функций необходимо учитывать следующее:
- Детерминизм: если функция возвращает одинаковое значение при каждом вызове с определенным набором входных данных и при одном и том же состоянии базы данных, мы говорим, что это детерминированная функция. Например, ROUND (1.1, 0) всегда возвращает значение 1.0. Многие встроенные функции являются недетерминированными. Например, функция GETDATE () возвращает текущую дату и время. Результаты недетерминированных функций нельзя индексировать. Это влияет на возможность обработчика запросов создавать хороший план для выполнения запроса.
- Параметры сортировки: какие параметры сортировки необходимо использовать при использовании функций, обрабатывающих символьные данные? Некоторые функции используют параметры сортировки (порядок сортировки) входного значения. Другие функции используют параметры сортировки базы данных, если не указаны входные параметры сортировки.
Примеры скалярных функций
На момент написания статьи в технической документации по SQL Server было указано более 200 скалярных функций, охватывающих несколько категорий, а именно:
- Функции конфигурации
- Функции преобразования
- Функции курсора
- Функции даты и времени
- Математические функции
- Функции метаданных
- Функции безопасности
- Строковые функции
- Системные функции
- Системные статистические функции.
- Функции работы с текстами и изображениями.
Времени, выделенного для этого курса, недостаточно для описания каждой функции, однако в приведенных ниже примерах показаны некоторые часто используемые функции.
В следующем гипотетическом примере используется несколько функций даты и времени:
SELECT SalesOrderID,
OrderDate,
YEAR(OrderDate) AS OrderYear,
DATENAME(mm, OrderDate) AS OrderMonth,
DAY(OrderDate) AS OrderDay,
DATENAME(dw, OrderDate) AS OrderWeekDay,
DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM Sales.SalesOrderHeader;
Частичные результаты приведены ниже:
SalesOrderID
Датазаказа
OrderYear
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T00:00:00
2008
июня
1
Воскресенье
13
...
...
...
...
...
...
...
В следующем примере приведены некоторые математические функции:
SELECT TaxAmt,
ROUND(TaxAmt, 0) AS Rounded,
FLOOR(TaxAmt) AS Floor,
CEILING(TaxAmt) AS Ceiling,
SQUARE(TaxAmt) AS Squared,
SQRT(TaxAmt) AS Root,
LOG(TaxAmt) AS Log,
TaxAmt * RAND() AS Randomized
FROM Sales.SalesOrderHeader;
Частичные результаты:
TaxAmt
Округлено
Этаж
Ceiling
В квадрате
Корневой
Журнал
Случайное
70,4279
70,0000
70,0000
71,0000
4960,089098
8,392133221
4,254589491
28,64120429
...
..
...
...
...
...
...
...
В следующем примере используются некоторые строковые функции:
SELECT CompanyName,
UPPER(CompanyName) AS UpperCase,
LOWER(CompanyName) AS LowerCase,
LEN(CompanyName) AS Length,
REVERSE(CompanyName) AS Reversed,
CHARINDEX(' ', CompanyName) AS FirstSpace,
LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1, LEN(CompanyName)) AS RestOfName
FROM Sales.Customer;
Частичные результаты:
CompanyName
Заглавная
Нижний регистр
Length
Reversed
FirstSpace
FirstWord
RestOfName
A Bike Store
A BIKE STORE
a bike store
12
erotS ekiB A
2
а
Bike Store
Progressive Sports
PROGRESSIVE SPORTS
progressive sports
18
stropS evissergorP
12
Прогрессивный
Спорт
Advanced Bike Components
ADVANCED BIKE COMPONENTS
advanced bike components
24
stnenopmoC ekiB decnavdA
9
Расширенные
Bike Components
...
...
...
...
...
...
...
...
Логические функции
Другая категория функций позволяет определить, какое из нескольких значений необходимо вернуть. Логические функции вычисляют входное выражение и возвращают соответствующее значение на основе результата.
IIF
Функция IIF вычисляет логическое входное выражение и возвращает указанное значение, если выражение имеет значение True, и альтернативное значение, если выражение имеет значение False.
Например, рассмотрим указанный ниже запрос, который вычисляет тип адреса клиента. Если значение равно "Главный офис", выражение возвращает значение "Выставление счетов". Для всех остальных значений типа адреса выражение возвращает значение "Корреспонденция".
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;
Частичные результаты из этого запроса могут выглядеть следующим образом:
AddressType
UseAddressFor
Главный офис
Выставление счетов
На основе доставки
Корреспонденция
...
...
CHOOSE
Функция CHOOSE вычисляет целочисленное выражение и возвращает соответствующее значение из списка на основе его порядкового номера (начиная с 1).
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;
Результаты этого запроса могут выглядеть примерно так:
SalesOrderID
Состояние
OrderStatus
1 234
3
Доставлено
1235
2
Доставлено
1236
2
Доставлено
1237
1
Заказано
...
...
...