SAP HANA SQL 函数:类型和示例

SAP HANA SQL 函数
SAP HANA 提供以下功能 SAP HANA 功能-
- 数据类型转换函数 – 数据类型转换函数用于将一种数据类型转换为另一种数据类型。以下是数据类型转换函数列表,例如 CAST、TO_ALPHANUM、TO_BIGINT、TO_BINARY 等。
- 日期时间函数 – 日期时间函数用于将日期/时间转换为不同的格式。例如:ADD_DAYS、ADD_MONTHS、ADD_SECOND 等。
- 全文功能 – 全文搜索功能用于文本搜索,例如:SCORE 等。
- 数字函数 – 数值函数接受数值或包含数字字符的字符串作为输入,并返回数值。例如:ABS、ROUND、POWER 等。
- 字符串函数 – 字符串函数以字符串作为输入,对其进行处理,并根据函数返回相应的值。例如(ASCII、CHAR、CONCAT 等)。
- 窗口函数 – 窗口函数允许用户将查询结果集划分为称为窗口分区的行组。例如 RANK()、DENSE_RANK()、ROW_NUMBER() 等。
- 杂项功能- 还有一些函数可用于处理杂项工作。例如 – 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.
