SAP Функции SQL в HANA: типы и примеры

⚡ Умное резюме

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

  • 🔄 Функции преобразования: Функции CAST, TO_BIGINT, TO_ALPHANUM и TO_BINARY преобразуют значение из одного типа данных в другой.
  • 📅 Функции работы с датой и временем: Параметры ADD_DAYS, ADD_MONTHS и ADD_SECONDS изменяют формат или переформатируют значения даты и времени.
  • 🔍 Функции полнотекстового поиска: Функции SCORE и аналогичные функции ранжируют результаты, полученные в результате текстового поиска.
  • 🔢 Функции чисел: Функции ABS, ROUND и POWER принимают на вход числовые значения и возвращают числовой результат.
  • 🔤 Строковые функции: ASCII, CHAR и CONCAT обрабатывают ввод символов и возвращают производное значение.
  • 🪟 Функции окна: Параметры RANK, DENSE_RANK и ROW_NUMBER делят результирующий набор на оконные разделы.
  • 🧰 Разное: Группы CONVERT_CURRENCY и CURRENT_SCHEMA обрабатывают задачи, выходящие за рамки остальных шести групп.

SAP Функции SQL HANA

SAP Функции SQL для HANA

SAP HANA предоставляет следующее SAP Функции HANA-

  1. Функция преобразования типов данных – Функция преобразования типов данных используется для преобразования одного типа данных в другой. Ниже приведен список функций преобразования типов данных, например CAST, TO_ALPHANUM, TO_BIGINT, TO_BINARY и т. д.
  2. Функции даты и времени – Функции работы с датами и временем используются для преобразования даты/времени в различные форматы. Например, ADD_DAYS, ADD_MONTHS, ADD_SECOND и т. д.
  3. Полнотекстовые функции – Функции полнотекстового поиска используются для поиска текста. Например, SCORE и т.д.
  4. Числовые функции – Функции для работы с числами принимают на вход числовое значение или строку с числовыми символами и возвращают числовые значения. Например: ABS, ROUND, POWER и т. д.
  5. Строковые функции – Строковые функции принимают строку в качестве входных данных, обрабатывают её и возвращают значение в соответствии с функцией. Например (ASCII, CHAR, CONCAT и т. д.).
  6. Оконные функции – Оконные функции позволяют пользователю разделить результирующий набор запроса на группы строк, называемые оконными разделами. Например, RANK(), DENSE_RANK(), ROW_NUMBER() и т. д.
  7. Разные функции- Есть еще несколько функций, которые используются для разной работы. Например – CONVERT_CURRENCY, CURRENT_SCHEMA и т. д.

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

Скалярные, агрегатные и оконные функции

Прежде чем перейти к примерам, следует отметить, что поведение функции в запросе определяется одним фактором: сколько строк вводится и сколько выводится.

Категория Входящие ряды: исходящие ряды Нужна группировка? Примеры
скаляр Один ряд к одному ряду Нет ВЕРХНИЙ, КРУГЛЫЙ, ДАТА, ЛИТОЙ
Заполнитель Много рядов в одном ряду Да, если только весь набор не представляет собой одну группу. СУММА, AVG, COUNT, MIN, MAX
Окно Много рядов к много рядам Нет, вместо этого используется OVER. RANK, DENSE_RANK, ROW_NUMBER, LAG
Таблица Возвращает набор результатов Используется в предложении FROM SERIES_GENERATE_DATE

Практическим следствием этого является то, что агрегирование сворачивает детали, в то время как оконная функция их сохраняет. Запрос данных по каждому сотруднику вместе со средним показателем по отделу требует использования оконной функции, поскольку использование GROUP BY полностью удалит отдельные строки.

Общие SAP Функции HANA с примерами

Приведённые ниже операторы можно вставить непосредственно в консоль SQL. Каждый из них демонстрирует одну категорию из приведённого выше списка.

1) Строковые функции. Эти функции принимают символьный ввод и возвращают производное значение.

SELECT
  UPPER('sap hana')               AS UPPER_TEXT,
  LENGTH('SAP HANA')              AS TEXT_LENGTH,
  CONCAT('SAP ', 'HANA')         AS JOINED,
  SUBSTRING('SAP HANA', 5, 4)   AS PART,
  REPLACE('SAP HANA', 'HANA', 'S/4') AS SWAPPED,
  TRIM('  padded  ')             AS CLEANED
FROM DUMMY;

2) Числовые функции. Стоит проверить поведение механизма скругления, поскольку ROUND использует коммерческое скругление, в то время как FLOOR и CEIL всегда движутся в одном направлении.

SELECT
  ABS(-45.7)          AS ABSOLUTE_VALUE,
  ROUND(123.4567, 2) AS ROUNDED,
  FLOOR(9.9)          AS ROUNDED_DOWN,
  CEIL(9.1)           AS ROUNDED_UP,
  POWER(2, 10)       AS RAISED,
  MOD(17, 5)         AS REMAINDER
FROM DUMMY;

3) Функции даты и времени. Именно эти данные чаще всего требуются для составления отчетов о менструальном цикле.

SELECT
  CURRENT_DATE                              AS TODAY,
  ADD_DAYS(CURRENT_DATE, 30)                AS IN_30_DAYS,
  ADD_MONTHS(CURRENT_DATE, -1)              AS LAST_MONTH,
  DAYS_BETWEEN('2026-01-01', CURRENT_DATE) AS ELAPSED,
  LAST_DAY(CURRENT_DATE)                    AS MONTH_END,
  WEEKDAY(CURRENT_DATE)                     AS DAY_INDEX
FROM DUMMY;

4) Функции преобразования. Явное преобразование предотвращает скрытое приведение типов, которое замедляет работу условия WHERE.

SELECT
  CAST('1234' AS INTEGER)               AS AS_NUMBER,
  TO_VARCHAR(CURRENT_DATE, 'DD.MM.YYYY') AS AS_TEXT,
  TO_DECIMAL(1234.5678, 10, 2)         AS AS_DECIMAL
FROM DUMMY;

Поведение типов и ограничения каждого целевого типа рассматриваются в SAP Типы данных HANA.

Объяснение функций окон

Оконная функция выполняет вычисления над набором строк, связанных с текущей строкой, без их объединения. Предложение OVER определяет этот набор и имеет две необязательные части: PARTITION BY разделяет данные на группы, а ORDER BY фиксирует последовательность внутри каждой группы.

SELECT
  DEPARTMENT,
  EMP_NAME,
  SALARY,
  ROW_NUMBER() OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS ROW_NUM,
  RANK()       OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS RANKING,
  DENSE_RANK() OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS DENSE_RANKING,
  SUM(SALARY)  OVER (PARTITION BY DEPARTMENT) AS DEPT_TOTAL
FROM DHK_SCHEMA.EMPLOYEE;

Три функции ранжирования различаются только в случае равенства значений:

  • ROW_NUMBER Ничья невозможна. Два человека с одинаковой зарплатой всё равно получают 1 и 2, выбранные произвольно.
  • RANK / ЗВАНИЕ При совпадении номеров рядов, затем пропуск. Два ряда с номером 1 сменяются тремя.
  • DENSE_RANK При совпадении номеров строк, строка в которых совпадает, номер остается тем же, пропуск не производится. Две строки с номером 1 сменяются строками с номером 2.

Используйте ROW_NUMBER для удаления дубликатов, RANK для ранжирования в соревновательном стиле и DENSE_RANK, когда последовательность должна оставаться непрерывной. Сравнение и логические символы, используемые вместе с этими функциями, описаны в [ссылка на соответствующий раздел]. SAP операторы HANAи структура оператора в SAP Хана SQL.

Часто задаваемые вопросы (FAQ)

Таблица DUMMY — это системная таблица, содержащая ровно одну строку. Она позволяет вычислять выражения или функции в операторе SELECT без обращения к какой-либо реальной таблице.

Оба алгоритма присваивают одинаковый номер строкам, имеющим одинаковые значения. Затем RANK пропускает следующие значения, поэтому за двумя первыми следует третье. DENSE_RANK не пропускает значения, поэтому за двумя первыми следует второе.

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

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

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

Подведем итог этой публикации следующим образом: