# 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(S,   ';' ,2)` | 如果 S 為 'abc;cde;efg'，則傳回 'cde'。 |
| `SubField(S,   ';' ,1)` | 如果 S 為空字串，則會傳回空字串 。 |
| `SubField(S,   ';' ,1)` | 如果 S 為 ';'，則傳回空字串。 |
| 假定您有一個包含路徑名稱 vMyPath，<br><br>`Set vMyPath=\Users\ext_jrb\Documents\Qlik\Sense\Apps;`。 | 在文字與影像圖表中，您可以新增量值，例如：<br>`SubField(vMyPath, '\',-3``)`，這將產生 'Qlik’，因為它是從變數 vMyPath 右端起的第三個子字串。 |

## 範例：使用 SubField 的指令碼和圖表運算式

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

#### 範例 - 指令碼和圖表運算式

### 基本範例

| 範例 | 結果 |
| --- | --- |
| `SubField(S,   ';' ,2)` | 如果 S 為 'abc;cde;efg'，則傳回 'cde'。 |
| `SubField(S,   ';' ,1)` | 如果 S 為空字串，則會傳回空字串 。 |
| `SubField(S,   ';' ,1)` | 如果 S 為 ';'，則傳回空字串。 |
| 假定您有一個包含路徑名稱 vMyPath，<br><br>`Set vMyPath=\Users\ext_jrb\Documents\Qlik\Sense\Apps;`。 | 在文字與影像圖表中，您可以新增量值，例如：<br>`SubField(vMyPath, '\',-3``)`，這將產生 'Qlik’，因為它是從變數 vMyPath 右端起的第三個子字串。 |

### 指令碼範例 1

#### 載入指令碼

在資料載入編輯器中載入下列指令碼運算式和資料。

```
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;
```

#### 建立視覺化

在 Qlik Sense 工作表中建立具有 Name、FirstName 和 SurName 作為維度的表格視覺化。

#### 結果

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

#### 解釋

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

### 指令碼範例 2

#### 載入指令碼

在資料載入編輯器中載入下列指令碼運算式和資料。

```
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 '|');
```

#### 建立視覺化

在 Qlik Sense 工作表中建立具有 Instrument、Player 和 Project 作為維度的表格視覺化。

#### 結果

| 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 選項，以免產生重複記錄。