# 表达式函数

在构建表达式时，使用函数来转换行值、处理缺失数据或检索相关值。有关详细信息，请参阅[构建表达式](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Transformation/Building-expressions.htm)。

以下函数描述了 SaaS 管理的登陆、湖登陆和复制任务中的移动任务表达式。使用编辑器中显示的函数签名。签名中的方括号表示可选参数；请勿输入方括号。

有关 CDC 存储和流式转换函数，请参阅 [转换函数](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Lakehouse/transformation-functions.htm)。对于在云数据平台上执行的存储、转换和数据集市表达式，请使用该平台的函数语法。

## 字符串函数

前缀和后缀函数作用于字符串的开头或结尾。字符替换作用于单个字符，而不是匹配整个前缀或后缀。

字符串函数参数、行为和示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$CONCAT(X, Y)` | 按此顺序连接两个字符串 `X` 和 `Y`。如果任一参数为 NULL，则返回 NULL。嵌套调用以连接两个以上的字符串。 | `$CONCAT('My', 'Picture')` 返回 `'MyPicture'`。`$CONCAT('My', NULL)` 返回 NULL。 |
| `$INSTR(string, substring)` | 返回 `substring` 在 `string` 中首次出现的基于 1 的位置。如果未找到子字符串，则返回 0。 | `$INSTR('mystring', 'ing')` 返回 `6`。`$INSTR('mystring', 'xyz')` 返回 `0`。 |
| `$LENGTH(string)` | 返回 `string` 中的字符数，而不是其字节大小。 | `$LENGTH('mystring')` 返回 `8`。 |
| `$LOWER(string)` | 返回 `string` 的副本，其中 ASCII 字母已转换为小写。 | `$LOWER('ABC')` 返回 `'abc'`。 |
| `$LTRIM(string[, characters])` | 从 `string` 的开头移除字符。可选的 `characters` 参数是一组要移除的字符，而不是前缀。如果省略，则移除空格。 | `$LTRIM('  orders')` 返回 `'orders'`。`$LTRIM('@@orders', '@')` 返回 `'orders'`。 |
| `$REMOVE_PREFIX(string, prefix)` | 返回移除了指定开头 `prefix` 的 `string` 副本。 | `$REMOVE_PREFIX('mystring', 'my')` 返回 `'string'`。 |
| `$REMOVE_SUFFIX(string, suffix)` | 返回移除了指定结尾 `suffix` 的 `string` 副本。 | `$REMOVE_SUFFIX('mystring', 'ing')` 返回 `'mystr'`。 |
| `$REPLACE(string, pattern, replacement)` | 将 `string` 中出现的每个 `pattern` 替换为 `replacement`。所有三个参数都是必需的。使用空替换字符串来删除匹配的文本。 | `$REPLACE('a-b-c', '-', '_')` 返回 `'a_b_c'`。`$REPLACE('a-b', '-', '')` 返回 `'ab'`。 |
| `$REPLACE_CHARS(string, chars, replacement)` | 将 `chars` 中列出的每个字符替换为 `replacement` 中相同位置的字符。未列出的字符保持不变。如果缺少替换位置，则使用第一个替换字符。 | `$REPLACE_CHARS('mystring', 's', 'z')` 返回 `'myztring'`。`$REPLACE_CHARS('abcde', 'abcd', '123')` 返回 `'1231e'`。 |
| `$REPLACE_PREFIX(string, prefix, replacement)` | 将 `string` 开头的 `prefix` 替换为 `replacement`。 | `$REPLACE_PREFIX('mystring', 'my', 'new')` 返回 `'newstring'`。 |
| `$REPLACE_SUFFIX(string, suffix, replacement)` | 将 `string` 中末尾的 `suffix` 替换为 `replacement`，而不是替换所有匹配项。 | `$REPLACE_SUFFIX('mystring', 'ing', 'new')` 返回 `'mystrnew'`。 |
| `$RTRIM(string[, characters])` | 从 `string` 的末尾移除字符。可选的 `characters` 参数是一组要移除的字符，而不是后缀。如果省略，则移除空格。 | `$RTRIM('orders  ')` 返回 `'orders'`。`$RTRIM('orders@@', '@')` 返回 `'orders'`。 |
| `$SUBSTR(string, start[, length])` | 从 `string` 中提取文本，从基于 1 的位置 `start` 开始。`length` 指定字符数。如果省略，则返回剩余字符。 | `$SUBSTR('abcdef', 2, 3)` 返回 `'bcd'`。 |
| `$TRIM(string[, characters])` | 移除 `string` 两端的字符。可选的 `characters` 参数是要移除的字符集，而不是子字符串。如果省略，则移除空格。 | `$TRIM('  orders  ')` 返回 `'orders'`。`$TRIM('@#orders#@', '@#')` 返回 `'orders'`。 |
| `$UNICODE(string)` | 返回 `string` 中第一个字符的 Unicode 码位数值。参数必须是字符串。 | `$UNICODE('ABC')` 返回 `65`。 |
| `$UPPER(string)` | 返回 `string` 的副本，其中 ASCII 字母已转换为大写。 | `$UPPER('abc')` 返回 `'ABC'`。 |

## 数字函数

使用这些函数计算当前行的数值。`$MAX` 和 `$MIN` 比较行内的参数，而不是跨行的值。

数值函数参数、行为及示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$ABS(X)` | 返回数值参数 `X` 的绝对值。 | `$ABS(-20)` 返回 `20`。 |
| `$MAX(arg1, arg2, ...)` | 返回所提供的数值参数中的最大值。至少提供两个参数。 | `$MAX(10, 4, 20, 9)` 返回 `20`。 |
| `$MIN(arg1, arg2, ...)` | 返回所提供数值参数中的最小值。至少提供两个参数。 | `$MIN(10, 4, 20, 9)` 返回 `4`。 |
| `$RANDOM()` | 返回一个伪随机有符号整数。不接受任何参数。 | `$RANDOM()` 返回一个整数，该整数可以为负数、零或正数。其值在各次调用之间会有所不同。 |
| `$ROUND(value[, digits])` | 将 `value` 四舍五入到 `digits` 位小数，并返回一个浮点值。如果省略 `digits`，则舍入到 0 位小数。 | `$ROUND(3.141592, 3)` 返回 `3.142`。 |

## LOB 函数

这些函数用于处理二进制大对象 (BLOB)。size 参数 `N` 指定的是字节，而非字符。

二进制值函数

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$HEX(blob)` | 返回表示 `blob` 的字节的大写十六进制文本。数值输入首先转换为文本；结果并非该数字的机器表示。 | `$HEX(X'4142')` 返回 `'4142'`。 |
| `$RANDOM_BLOB(N)` | 返回 `N` 个伪随机字节。如果 `N` 小于 1，则返回一个字节。请勿使用此函数来保证密码学随机性。 | `$RANDOM_BLOB(4)` 返回一个 4 字节的 BLOB。其值在各次调用之间会有所不同。 |
| `$ZERO_BLOB(N)` | 返回包含 `N` 个零字节的 BLOB。 | `$HEX($ZERO_BLOB(3))` 返回 `'000000'`。 |

## Null 检查函数

Null 检查函数参数、行为和示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$COALESCE(X, Y, ...)` | 按参数顺序返回第一个非 NULL 参数。至少提供两个参数。如果所有参数均为 NULL，则结果为 NULL。空字符串不是 NULL。 | `$COALESCE(NULL, 'Unknown')` 返回 `'Unknown'`。`$COALESCE('', 'Unknown')` 返回空字符串。 |
| `$IFNULL(X, Y)` | 如果 `X` 不为 NULL，则返回该值；否则返回 `Y`。如果两个参数都为 NULL，则返回 NULL。请提供恰好两个参数。 | `$IFNULL(NULL, 'Unknown')` 返回 `'Unknown'`。`$IFNULL('Known', 'Unknown')` 返回 `'Known'`。 |
| `$NULLIF(X, Y)` | 如果 `X` 和 `Y` 相等，则返回 NULL；否则返回 `X`。请提供恰好两个参数。 | `$NULLIF('Unknown', 'Unknown')` 返回 NULL。`$NULLIF('Known', 'Unknown')` 返回 `'Known'`。 |

## 日期和时间函数

提供日期、时间或日期时间字符串，例如 `'2026-10-08'`、`'12:34:56'` 或 `'2026-10-08 12:34:56'`。将日期常量放在引号内，这样连字符就不会被解释为减法。

日期计算与格式化

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$DATE(date_string)` | 以 `YYYY-MM-DD` 格式将 `date_string` 中的日期作为文本返回。 | `$DATE('2026-10-08')` 返回 `'2026-10-08'`。 |
| `$DATETIME(datetime_string)` | 以 `YYYY-MM-DD HH:MM:SS` 格式将 `datetime_string` 中的日期和时间作为文本返回。 | `$DATETIME('2026-10-08 12:34:56')` 返回 `'2026-10-08 12:34:56'`。 |
| `$JULIANDAY(datetime_string)` | 返回自公元前 4714 年 11 月 24 日格林尼治正午以来的小数天数。将两个儒略日值相减以计算经过的天数。 | `$JULIANDAY('2000-01-01 12:00:00')` 返回 `2451545.0`。`$JULIANDAY('2026-10-09') - $JULIANDAY('2026-10-08')` 返回 `1.0`。 |
| `$STRFTIME(format, datetime_string)` | 返回使用 `format` 格式化的文本。格式位于日期或日期时间输入之前。 | `$STRFTIME('%Y-%m', '2026-10-08')` 返回 `'2026-10'`。 |
| `$TIME(time_string)` | 以 `HH:MM:SS` 格式将 `time_string` 中的时间作为文本返回。 | `$TIME('12:34:56')` 返回 `'12:34:56'`。 |

### 格式替换

在 `$STRFTIME` 中将以下替换项与字面分隔符组合。例如，`'%Y-%m-%d %H:%M:%S'` 会同时格式化日期和时间。不支持的替换返回 NULL。

日期和时间格式替换

| 替换 | 含义 |
| --- | --- |
| `%d` | 月中的日期，01-31。 |
| `%H` | 小时，00-24。 |
| `%f` | 带小数部分的秒，SS.SSS。 |
| `%j` | 一年中的第几天，001-366。 |
| `%J` | 儒略日数。 |
| `%m` | 月份，01-12。 |
| `%M` | 分钟，00-59。 |
| `%s` | 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。 |
| `%S` | 秒，00-59。 |
| `%w` | 星期几，0-6；星期日为 0。 |
| `%W` | 一年中的周数，00-53；每周从星期一开始。 |
| `%Y` | 年份，0000-9999。 |
| `%%` | 百分号字面量。 |

## 数据丰富函数

使用查找从源端点或目标端点中的表中添加关联值（例如部门名称）。

数据富化函数参数、行为和示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$SOURCE_LOOKUP(time_to_live, schema, table, expression, condition, condition_params)` | 针对与 `condition` 匹配的记录，从 `schema` 中源端点的 `table` 检索 `expression` 的值。条件参数按顺序为其占位符提供值。 | `$SOURCE_LOOKUP(60, 'HR', 'DEPARTMENTS', 'DEPARTMENT_NAME', 'DEPARTMENT_ID=:1', $DEPARTMENT_ID)` 从源中检索匹配的部门名称。 |
| `$TARGET_LOOKUP(time_to_live, schema, table, expression, condition, condition_params)` | 针对与 `condition` 匹配的记录，从目标端点的 `table`（位于 `schema` 中）检索 `expression` 的值。条件参数按顺序为其占位符提供值。 | `$TARGET_LOOKUP(60, 'dbo', 'DEPARTMENTS', 'DEPARTMENT_NAME', 'DEPARTMENT_ID=?', $DEPARTMENT_ID)` 从目标中检索匹配的部门名称。 |

`condition_params` 表示以逗号分隔的参数列表，而不是单个数组参数。这两个函数都使用以下参数：

查找参数及其关系

| 参数 | 含义 |
| --- | --- |
| `time_to_live` | 必需的缓存生命周期，无默认值。提供以秒为单位的缓存生命周期，`'NO_CACHING'` 用于禁用缓存，或 `'NO_EXPIRATION'` 用于保留缓存结果且永不过期。<br><br>较短的生命周期可刷新频繁更改的数据。更长的生命周期可以减少端点查询，但在查找数据发生更改后可能会返回缓存值。仅对不会更改的数据使用永不过期。 |
| `schema` | 包含查找表的架构，以文本形式提供。 |
| `table` | 该架构内要查询的表，以文本形式提供。 |
| `expression` | 选择单个列值的 SQL 表达式，例如 `'DEPARTMENT_NAME'` 或 `'PRICE * 1.2'`。使用所访问端点的 SQL 方言，而不是外层表达式的函数语法。 |
| `condition` | 用于标识查找记录的 SQL 条件。使用所访问端点的方言和占位符语法：例如，Oracle 使用 `:1` 和 `:2`，或者适用于 Microsoft SQL Server 的 `?`。 |
| `condition_params` | 按顺序绑定到条件占位符的值。诸如 `$COMPANY_ID` 和 `$DEPARTMENT_ID` 等列参数提供来自当前行的值。 |

为查找字段创建索引以降低查询成本。选择用于标识目标记录的条件，并将添加的列的数据类型设置为与所选值匹配。

信息注释不支持测试对 `$SOURCE_LOOKUP` 和 `$TARGET_LOOKUP` 的调用。请参阅 [测试表达式](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Transformation/Building-expressions.htm#Testing)。

### 源查找示例

对于 Oracle 数据源，以下表达式从 `HR.DEPARTMENTS` 检索 `DEPARTMENT_NAME` 并将结果缓存 60 秒：

```
$SOURCE_LOOKUP(60, 'HR', 'DEPARTMENTS', 'DEPARTMENT_NAME', 'DEPARTMENT_ID=:1', $DEPARTMENT_ID)
```

如果当前行包含 `DEPARTMENT_ID` 10，且匹配的查找记录包含 `'Sales'`，则结果为 `'Sales'`。

对于 Microsoft SQL Server 源，请使用其条件占位符语法。本示例按此顺序绑定公司和部门的值：

```
$SOURCE_LOOKUP(60, 'dbo', 'DEPARTMENTS', 'DEPARTMENT_NAME', 'COMPANY_ID=? AND DEPARTMENT_ID=?', $COMPANY_ID, $DEPARTMENT_ID)
```

### 目标查找示例

对于 Microsoft SQL Server 目标，使用其 SQL 方言查询目标表：

```
$TARGET_LOOKUP(60, 'dbo', 'DEPARTMENTS', 'DEPARTMENT_NAME', 'DEPARTMENT_ID=?', $DEPARTMENT_ID)
```

如果部门 10 的目标查找记录包含 `'Sales'`，则输入值为 10 的结果为 `'Sales'`。

## 运算函数

操作函数参数、行为和示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$OPERATION_INDICATOR(value_on_delete, value_on_update, value_on_insert)` | 返回您为每个源操作指定的标志。参数顺序为删除、更新，然后是插入。使用专用列存储标志，并提供与其数据类型匹配的标志值。 | `$OPERATION_INDICATOR('Deleted', 'Updated', 'Inserted')` 在更新时返回 `'Updated'`。 |

在 Qlik Replicate 中，此函数还会更改删除处理方式：它会保留相应的目标记录，并使用 `value_on_delete` 对其进行标记。对于 Qlik Talend Cloud Data Integration，此删除处理行为需要确认。

## 逻辑函数

条件值选择

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$IFF(boolean_expression, true_value, false_value)` | 如果 `boolean_expression` 的计算结果为 true，则返回 `true_value`；否则返回 `false_value`。首先提供条件，后跟两个结果值。 | `$IFF(10 > 5, 'High', 'Low')` 返回 `'High'`。`$IFF(3 > 5, 'High', 'Low')` 返回 `'Low'`。 |

## 其他功能

模式匹配与值类型

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$LIKE(pattern, string[, escape_character])` | 匹配时返回 1，不匹配时返回 0；输入 NULL 则返回 NULL。`%` 匹配零个或多个字符；`_` 匹配一个字符。匹配默认忽略 ASCII 字母大小写。可选的转义符为一个字符。与 `LIKE` 运算符不同，模式排在前面。 | `$LIKE('A%', 'Alice')` 返回 `1`。`$LIKE('10!%', '10%', '!')` 返回 `1`。 |
| `$TYPEOF(expression)` | 返回值的存储类：`'null'`、`'integer'`、`'real'`、`'text'` 或 `'blob'`。这不是配置的输出列类型。 | `$TYPEOF(12.5)` 返回 `'real'`。 |

## 哈希函数

哈希函数参数、行为和示例

| 函数 | 行为与参数 | 示例和结果 |
| --- | --- | --- |
| `$SHA256(string)` | 返回输入字符串的十六进制 SHA-256 哈希值。 | `$SHA256('abc')` 返回 `ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad`。 |

哈希不是加密。可预测的输入值仍然可以通过比较其哈希值来识别。