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

Завершено

Скалярные функции возвращают одно значение и обычно работают с одной строкой данных. Количество входных значений, которое они принимают может быть равно нулю (например, 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;

Частичные результаты приведены ниже:

ID заказа на продажу

Датазаказа

Год заказа

МесяцЗаказа

День заказа

ДеньНеделиЗаказа

Годы с момента заказа

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

Округлено

Этаж

Потолок

В квадрате

Корневой

Журнал

Случайное

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;

Частичные результаты:

Имя Компании

Заглавная

Нижний регистр

Длина

Обратный

FirstSpace

Первое Слово

RestOfName

Магазин велосипедов

МАГАЗИН ВЕЛОСИПЕДОВ

магазин велосипедов

12

erotS ekiB A

2

а

Магазин велосипедов

Прогрессивные виды спорта

ПРОГРЕССИВНЫЕ ВИДЫ СПОРТА

прогрессивные виды спорта

18

stropS evissergorP

12

Прогрессивный

Спорт

Расширенные компоненты велосипеда

ПРОДВИНУТЫЕ КОМПОНЕНТЫ ВЕЛОСИПЕДА

усовершенствованные компоненты велосипеда

двадцать четыре

Продвинутые компоненты велосипеда

9

Расширенные

Компоненты велосипеда

...

...

...

...

...

...

...

...

Логические функции

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

IIF

Функция IIF вычисляет логическое входное выражение и возвращает указанное значение, если выражение оценивается как True, и альтернативное значение, если выражение оценивается как False.

Например, рассмотрим указанный ниже запрос, который вычисляет тип адреса клиента. Если значение равно "Главный офис", выражение возвращает значение "Выставление счетов". Для всех остальных значений типа адреса выражение возвращает значение "Корреспонденция".

SELECT AddressType,
      IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM Sales.CustomerAddress;

Частичные результаты из этого запроса могут выглядеть следующим образом:

ТипАдреса

UseAddressFor

Главный офис

Выставление счетов

На основе доставки

Корреспонденция

...

...

ВЫБЕРИТЕ

Функция CHOOSE оценивает целочисленное выражение и возвращает соответствующее значение из списка по его порядковому номеру (начиная с 1).

SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM Sales.SalesOrderHeader;

Результаты этого запроса могут выглядеть примерно так:

ID заказа на продажу

Состояние

Статус заказа

1 234

3

Доставлено

1235

2

Доставлено

1236

2

Доставлено

1237

1

Заказано

...

...

...