# When

when 前缀和后缀用于创建确定是否应执行语句或 exit 子句的条件子句。它可以被看作是完整的 if..end if 语句的简洁替代形式。

语法：

(when condition statement | exitstatement when condition )

返回数据类型： 布尔值

在 Qlik Sense 中，布尔 true 值由 -1 表示，false 值由 0 表示。

如果评估条件为 True，则将仅执行 statement 或 exitstatement。

`When` 前缀可以在已有一个或多个其他语句的语句中使用，包括其他 `When` 或 `Unless` 前缀。

适用场景

`When` 语句返回布尔值结果。通常，当用户希望加载或排除脚本的部分时，这种类型的函数将用作条件。

参数

| 参数 | 说明 |
| --- | --- |
| condition | 用于评估 TRUE 或 FALSE 的逻辑表达式 |
| statement | 任意 Qlik Sense 脚本语句，不包括控制语句。 |
| exitstatement | exit for、exit do 或 exit sub 子句或 exit script 语句。 |

## 区域设置

除非另有规定，本主题中的示例使用以下日期格式：MM/DD/YYYY。日期格式已经在数据加载脚本中的 `SET DateFormat` 语句中指定。由于区域设置和其他因素，系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者，您可以更改加载脚本中的格式以匹配这些示例。

应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典，则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。

函数示例

| 示例 | 结果 |
| --- | --- |
| ` exit script when A=1;  ` | 当 `A=1` 语句被计算为 TRUE 时，脚本将停止。 |
| `when A=1 LOAD * from myfile.csv;` | 当 `A=1` 语句被计算为 TRUE 时，将加载 `myfile.csv`。 |
| `when A=1 unless B=2 drop table Tab1;` | 当语句 `A=1`的计算结果为 TRUE 时，如果 `B=2` 的计算结果为 FALSE，则 `Tab1` 表将被删除。 |

## 示例 1 – When 前缀

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

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 一个初始数据集，其中包含发送到名为 ‘`Transactions`’ 的表的日期和金额。

* 声明变量 `A` 已创建且值为 `1` 的 `Let` 语句。

* 提供条件的 `When` 条件，所提供的条件为如果 `A` 等于 `1`，则将继续加载脚本。

加载脚本

```
LET A = 1; 

WHEN A = 1 
 
Transactions: 
LOAD  
*  
Inline [ 
id, date, amount 
1, 08/30/2018, 23.56 
2, 09/07/2018, 556.31 
3, 09/16/2018, 5.75 
4, 09/22/2018, 125.00 
5, 09/22/2018, 484.21 
6, 09/22/2018, 59.18 
7, 09/23/2018, 177.42 
]; 
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `id`
* `date`
* `amount`

结果表

| id | date | amount |
| --- | --- | --- |
| 1 | 08/30/2018 | 23.56 |
| 2 | 09/07/2018 | 556.31 |
| 3 | 09/16/2018 | 5.75 |
| 4 | 09/22/2018 | 125.00 |
| 5 | 09/22/2018 | 484.21 |
| 6 | 09/22/2018 | 59.18 |
| 7 | 09/23/2018 | 177.42 |

因为变量 `A` 在脚本开始时被赋值 `1`，所以会计算前缀 `When` 后面的条件，并返回结果 TRUE。因为它返回 TRUE 结果，所以脚本继续运行 Load 语句。可以看到结果表中的所有记录。

如果此变量值设置为任何不等于 `1` 的值，则不会将任何数据加载到数据模型中。

## 示例 2 – When 后缀

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

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 三个数据集，其中包含发送到名为 ‘`Transactions`’ 的表的日期和金额。

  * 第一个数据集包含交易 1-7。

  * 第而个数据集包含交易 8-14。

  * 第三个数据集包含交易 15-21。

* 确定 ‘`Transactions`’ 表是否包含十行以上的 `When` 条件。如果任何 `When` 语句的计算结果为 TRUE，则加载脚本将停止。此条件放置在三个数据集的每一个的末尾。

加载脚本

```
Transactions: 
LOAD  
*  
Inline [ 
id, date, amount 
1, 08/30/2018, 23.56 
2, 09/07/2018, 556.31 
3, 09/16/2018, 5.75 
4, 09/22/2018, 125.00 
5, 09/22/2018, 484.21 
6, 09/22/2018, 59.18 
7, 09/23/2018, 177.42 
]; 
 
exit script when NoOfRows('Transactions') > 10 ; 

Concatenate
LOAD 
*  
Inline [ 
id, date, amount 
8, 10/01/2018, 164.27 
9, 10/03/2018, 384.00 
10, 10/06/2018, 25.82 
11, 10/09/2018, 312.00 
12, 10/15/2018, 4.56 
13, 10/16/2018, 90.24 
14, 10/18/2018, 19.32 
]; 

exit script when NoOfRows('Transactions') > 10 ; 
 
Concatenate 
LOAD 
*  
Inline [ 
id, date, amount 
15, 10/01/2018, 164.27 
16, 10/03/2018, 384.00 
17, 10/06/2018, 25.82 
18, 10/09/2018, 312.00 
19, 10/15/2018, 4.56 
20, 10/16/2018, 90.24 
21, 10/18/2018, 19.32 
]; 
 
exit script when NoOfRows('Transactions') > 10 ; 
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `id`
* `date`
* `amount`

结果表

| id | date | amount |
| --- | --- | --- |
| 1 | 08/30/2018 | 23.56 |
| 2 | 09/07/2018 | 556.31 |
| 3 | 09/16/2018 | 5.75 |
| 4 | 09/22/2018 | 125.00 |
| 5 | 09/22/2018 | 484.21 |
| 6 | 09/22/2018 | 59.18 |
| 7 | 09/23/2018 | 177.42 |
| 8 | 10/01/2018 | 164.27 |
| 9 | 10/03/2018 | 384.00 |
| 10 | 10/06/2018 | 25.82 |
| 11 | 10/09/2018 | 312.00 |
| 12 | 10/15/2018 | 4.56 |
| 13 | 10/16/2018 | 90.24 |
| 14 | 10/18/2018 | 19.32 |

三个数据集中的每一个都有七个交易。第一个数据集包含交易 1-7 并加载到应用程序中。此 Load 语句后面的 `When` 条件计算为 FALSE，因为 ‘`Transactions`’ 表中的行少于 10 行。加载脚本继续到下一个数据集。

第二个数据集包含交易 8-14 并加载到应用程序中。第二个 `When` 条件的计算结果为 TRUE，因为 ‘`Transactions`’ 表中有 10 行以上。因此，脚本终止。

## 示例 3 – 多个 When 非前缀

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

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 包含单个交易的数据集被创建为名为 '`Transactions`' 的表。

* 触发的 `For` 循环包含两个嵌套 `When` 条件，用于评估：

  1. '`Transactions`' 表中的记录是否少于 `100` 条。

  2. '`Transactions`' 表中的记录数是否不是 `6` 的倍数。

加载脚本

```
RowsCheck = NoOfRows('Transactions') < 100 or mod(NoOfRows('Transactions'),6) <> 0;
Transactions: 
Load 
	0 as id 
Autogenerate 1; 
For i = 1 to 100 
	when(RowsCheck)
		Concatenate 
	Load 
		if(isnull(Peek(id)),1,peek(id)+1) as id 
	Autogenerate 7;     
next i 
```

结果

加载数据并打开工作表。创建新表并将该字段添加为维度：

* `id`

结果表仅显示前五个交易 ID，但加载脚本创建 36 行，然后在满足 `When` 条件后终止。

结果表

| id |
| --- |
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| +30 多行 |

`For` 循环中嵌套的 `When` 条件评估以下问题：

* `Transactions` 表中的行数是否不到 100？

* `Transactions` 表中的记录总数是否不是 6 的倍数？

每当两个 `When` 条件都返回值 TRUE 时，将生成另外七条记录并将其串联到现有的 ‘`Transactions`’ 表上。

`When` 条件返回 TRUE 值五次。此时，‘`Transactions`’ 表中总共有 36 行数据。

在 '`Transactions`' 表中创建 36 行数据时，第二条 `When` 语句返回值 FALSE，因此将不再执行此后的 Load 语句。