# 運算式函式

建立運算式時，使用函式來轉換資料列的值、處理遺失資料，或擷取相關值。如需詳細資訊，請參閱 [建置運算式](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Transformation/Building-expressions.htm)。

下列函數說明 SaaS 管理的登陸、湖登陸與複寫任務中的移動任務運算式。使用編輯器中顯示的函式簽章。簽章中的中括號表示選用引數；請勿輸入括號。

如需 CDC 儲存和串流轉換函式，請參閱 [轉換函數](https://help.qlik.com/zh-TW/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)` 傳回四個位元組的 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)` | 若不為 NULL，則傳回 `X`；否則傳回 `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)` | 將來自 `time_string` 的時間以 `HH:MM:SS` 格式傳回為文字。 | `$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` 的記錄，從 `schema` 中目標端點的 `table` 擷取 `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-TW/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`。 |

雜湊並非加密。可預測的輸入值仍可透過比對其雜湊值來識別。