# SubField 指令碼與圖表函數

SubField() 用來從上層字串欄位中擷取子字串元件，其中原始記錄欄位包含兩個或多個部分，以分隔符號分隔。

可以使用 Subfield() 函數，例如，為了從包含完整名稱的記錄清單中擷取名字和暱稱、路徑名稱的元件部分，或者從逗點分隔的表格中擷取資料。

如果您在 LOAD 陳述式中使用 Subfield() 函數，並且省略選用 field\_no 參數，將針對每一個子字串產生一筆完整記錄。如果使用 Subfield() 載入數個欄位，則會建立所有組合的 Cartesian 產品。

語法：

SubField(text, delimiter[, field\_no ])

傳回的資料類型： 字串

引數

| 引數 | 描述 |
| --- | --- |
| text | 原始字串。這可以是硬式編碼文字、變數、貨幣符號展開或其他運算式。 |
| delimiter | 輸入 text 內將字串分為元件部分的字元。 |
| field\_no | 選用第三引數是一個整數，指定要傳回上層字串 text 中的哪個子字串。使用值 1 可傳回第一個子字串，使用值 2 可傳回第二個子字串，以此類推。<br><br><ul> <li>若 <span>field_no</span> 為正值，會從左至右擷取子字串。</li> <li>若 <span>field_no</span> 為負值，會從右至左擷取子字串。</li> </ul> |

提示備註 可以使用 SubField()，來取代函數的複雜組合 (例如 Len()、Right()、Left()、Mid() 及其他字串函數)。

範例：圖表運算式

| 範例 | 結果 |
| --- | --- |
| `SubField( 'abc;cde;efg',   ';' ,2 )` | 傳回 `cde` |
| `SubField( Null,   ';' ,1 )` | 傳回空字串 |
| `SubField( ';',   ';' ,1 )` | 傳回空字串 |
| `SubField( '\Users\ext_jrb\Documents\Qlik\Sense\Apps;','\',-3 )` | 傳回 `Qlik` |

## 範例 - SubField 基礎事項

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 圖表運算式

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 載入到稱為 `Example` 之資料表格的資料集。

* 資料表格中稱為 `Name` 的一個欄位。

載入指令碼

```
Example:
Load * inline [
Name
Dave Owen
Joe Tem
];
```

結果

載入資料並開啟工作表。建立新的表格並將此欄位新增為維度：

* ` Name
                                   `

建立下列計算維度：

* `=SubField(Name, ' ',1)`，用來擷取出現在空格 `' '` 分隔符號之前的第一個子字串。

* `=SubField(Name, ' ',-1)`，用來擷取出現在空格 `' '` 分隔符號之前的第一個子字串，從字串右側開始。

Results table

| Name | SubField(Name, ' ',1) | SubField(Name, ' ',-1) |
| --- | --- | --- |
| Dave Owen | Dave | Owen |
| Joe Tem | Joe | Tem |

`SubField()` 函數將 `field_no` 引數設定為 1，以擷取 `Name` 的第一個子字串。由於 `field_no` 的值為正值，擷取子字串時會按照由左至右的順序。第二個函數呼叫將 `field_no` 引數設定為 -1，以擷取第二個子字串，這按照由右至左的順序擷取子字串。

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 載入指令碼

載入指令碼

開啟 資料載入編輯器 並將下列載入指令碼新增至新區段。

```
FullName:
LOAD * inline [
Name
'Dave Owen'
'Joe Tem'
];

SepNames:
Load Name,
SubField(Name, ' ',1) as FirstName,
SubField(Name, ' ',-1) as Surname
Resident FullName;
Drop Table FullName;
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* `Name`
* `FirstName`
* `SurName`

Results table

| Name | FirstName | SurName |
| --- | --- | --- |
| Dave Owen | Dave | Owen |
| Joe Tem | Joe | Tem |

解釋

`SubField` 函數將 `field_no` 引數設定為 1，以擷取第一個子字串 `Name`。由於 `field_no` 的值為正值，擷取子字串時會按照由左至右的順序。第二個函數呼叫將 `field_no` 引數設定為 -1，以擷取第二個子字串，這按照由右至左的順序擷取子字串。

## 範例 - SubField 使用情境

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 圖表運算式

概述

產品資料集包含一個產品表格。表格中的每個產品都有一個標記欄位，可識別產品領域。產品的標記欄位可以有多個值。例如，小組件 A 有以下標記：電子產品、小裝置、居家。標記值由管線分隔符號 (|) 字元作為分隔符號。此範例向您顯示如何使用 `SubField` 函數擷取特定標記值。

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 載入到稱為 `Example` 之資料表格的資料集。

* 資料表格中的欄位如下：

  * `ProductID`

  * `ProductName`

  * `Tags`

  * `Sales`

載入指令碼

```
Example:
Load  *
INLINE [
ProductID, ProductName, Tags, Sales
1, Widget A, Electronics|Gadgets|Home, 150
2, Widget B, Electronics|Accessories, 200
3, Widget C, Furniture|Home, 100
4, Widget D, Gadgets|Accessories, 250
];
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* ` ProductID
                                   `

* `ProductName`

* `Tags`

建立下列計算維度：

* `=SubField(Tags, '|',1)`，用來擷取 `Tags` 欄位中的第一個項目。

* `=SubField(Tags, '|',2)`，用來擷取 `Tags` 欄位中的第二個項目。

* `=SubField(Tags, '|',3)`，用來擷取 `Tags` 欄位中的第三個項目。

Results table

| ProductID | ProductName | Tags | SubField(Tags, '\|', 1) | SubField(Tags, '\|', 2) | SubField(Tags, '\|', 3) |
| --- | --- | --- | --- | --- | --- |
| 1 | Widget A | Electronics\|Gadgets\|Home | Electronics | Gadgets | Home |
| 2 | Widget B | Electronics\|Accessories | Electronics | Accessories | - |
| 3 | Widget C | Furniture\|Home | Furniture | Home | - |
| 4 | Widget D | Gadgets\|Accessories | Gadgets | Accessories | - |

`SubField` 函數的輸出已成功傳回原始 `Tags` 字串中相關位置的標記。

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 載入指令碼

載入指令碼

開啟 資料載入編輯器 並將下列載入指令碼新增至新區段。

```
LOAD DISTINCT
Instrument,
SubField(Player,',') as Player,
SubField(Project,',') as Project;

Load * inline [
Instrument|Player|Project
Guitar|Neil,Mike|Music,Video
Guitar|Neil|Music,OST
Synth|Neil,Jen|Music,Video,OST
Synth|Jo|Music
Guitar|Neil,Mike|Music,OST
] (delimiter is '|');
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* Instrument

* Player

* Project

Results table

| Instrument | Player | Project |
| --- | --- | --- |
| Guitar | Mike | Music |
| Guitar | Mike | Video |
| Guitar | Mike | OST |
| Guitar | Neil | Music |
| Guitar | Neil | Video |
| Guitar | Neil | OST |
| Synth | Jen | Music |
| Synth | Jen | Video |
| Synth | Jen | OST |
| Synth | Jo | Music |
| Synth | Neil | Music |
| Synth | Neil | Video |
| Synth | Neil | OST |

解釋

此範例展示如何從相同的 LOAD 陳述式中使用 Subfield() 函數的多個執行個體 (每個執行個體均忽略 field\_no 參數) 建立所有組合的笛卡兒乘積。將使用 DISTINCT 選項，以免產生重複記錄。