SAP HANA SQL 函数:类型和示例

⚡ 智能摘要

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 HANA SQL 函数

SAP HANA SQL 函数

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计数、最小值、最大值
窗口 多行到多行 不,它使用的是 OVER 而不是 OVER。 排名、密集排名、行号、滞后
返回结果集 用于 FROM 子句 系列生成日期

实际结果是,聚合函数会省略详细信息,而窗口函数则会保留这些信息。例如,要查询每位员工及其所在部门的平均数据,就需要使用窗口函数,因为使用 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 分,这个分数是任意选择的。
  • 如果行号相同,则赋值为 1,然后跳过。例如,两个行号为 1 的行后面紧跟着 3。
  • 密集排名 并列的行编号相同,不会跳过。编号为 1 的两行之后紧接着是编号为 2 的行。

使用 ROW_NUMBER 进行去重,使用 RANK 进行竞赛式排名,使用 DENSE_RANK 保持序列完整。与这些函数一起使用的比较符号和逻辑符号将在后续章节中介绍。 SAP HANA 操作员以及语句结构 SAP HANA SQL.

常见问题

DUMMY 表是一个仅包含一行数据的系统表。它允许在 SELECT 语句中计算表达式或函数,而无需引用任何实际表。

两种方法都给并列的行赋予相同的编号。RANK 函数会跳过后面的值,因此两个第一名之后紧接着是第三名。DENSE_RANK 函数则不会跳过,因此两个第一名之后紧接着是第二名。

是的。用简单的语言描述转换过程可以返回匹配的函数和语法,这比扫描包含数百个条目的参考列表要快得多。

通常情况下,对已过滤列进行函数包装会妨碍高效过滤,而人工智能可以重构谓词,从而保持列不变。请参考执行计划进行确认。

是的,但将其应用于列会强制对每一行进行计算。尽可能改为转换常量,这样仍然可以有效地筛选列。

总结一下这篇文章: