# On-Demand 模板应用程序中的绑定表达式

模板应用程序中的数据绑定指定使用相应选择应用程序中的哪些数据来构造将数据加载到 On-demand 应用程序中时所发出的查询。

绑定表达式的基本形式--$(odag\_FIELDNAME)--并非可用于绑定表达式的唯一方法。其他前缀可用于优化选择项并确保模板应用程序正确加载数据。

## 可用的绑定前缀

一般的前缀形式为 odag[s|o][n][cnt]，其中：

* s - 仅包括选择的值
* o - 仅包括可选值
* n - 选取数字版本，默认无引号
* cnt - 插入值的数目而非实际值

下表提供了所有可用绑定前缀版本的列表。这些示例假定一个名为 MyField 并以 1,2,3 作为选定值（绿色值）而以 4 作为可选选定值（白色值）的字段。

绑定前缀

| 前缀 | 描述 | 示例 | 替换为 |
| --- | --- | --- | --- |
| odag\_ | 替换为选定（绿色）和可选（白色）值。选取值的文本版本。这是字符串值的标准前缀。 | $(odag\_MyField) | '1','2','3','4' |
| odagcnt\_ | 替换为相应 odag\_ 绑定中的值数。此前缀用于优化查询。 | $(odagcnt\_MyField) | 4 |
| odagn\_ | 替换为选定（绿色）和可选（白色）值。选取值的数字版本。这是数字值的标准前缀。<br><br>信息注释<br><br>如果数据模型不能有字段的选定值或可选值，则必须在表达式中指定 noValue。例如，`$(odagn_MyField){"noValue":"-99999"}`。<br><br>有关更多信息，请参阅[更改值引号字符和分隔符字符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Changing)。 | $(odagn\_MyField) | 1,2,3,4 |
| odagncnt\_ | 替换为相应 odagn\_ 绑定中的值数。这用于优化查询。 | $(odagncnt\_MyField) | 4 |
| odago\_ | 替换为可选（白色）值。选取值的文本版本。这用于优化查询。<br><br>[为大型数据库优化](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odago\_MyField) | '4' |
| odagocnt\_ | 替换为相应 odago\_ 绑定中的值数。这用于优化查询。 | $(odagocnt\_MyField) | 1 |
| odagon\_ | 替换为可选（白色）值。选取值的数字版本。这用于优化查询。<br><br>[为大型数据库优化](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odagon\_MyField) | 4 |
| odagoncnt\_ | 替换为相应 odagon\_ 绑定中的值数。这用于优化查询。 | $(odagoncnt\_MyField) | 1 |
| odags\_ | 替换为选定（绿色）值。选取值的文本版本。这用于优化查询。<br><br>[为大型数据库优化](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odags\_MyField) | '1','2','3' |
| odagscnt\_ | 替换为相应 odags\_ 绑定中的值数。这用于优化查询。 | $(odagscnt\_MyField) | 3 |
| odagsn\_ | 替换为选定（绿色）值。选取值的数字版本。这用于优化查询。<br><br>[为大型数据库优化](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odagsn\_MyField) | 1,2,3 |
| odagsncnt\_ | 替换为相应 odagsn\_ 绑定中的值数。这用于优化查询。 | $(odagsncnt\_MyField) | 3 |

信息注释

空值在文本版本中会被筛选掉。非数值和 NaN 值在数值版本中会被筛选掉。

## 为大型数据库优化

odags\_ 和 odagsn\_ 前缀用于优化查询。当绑定字段中没有选择时，odag\_ 包含所有值，而 odags\_ 不包含值。在某些情况下，使用 odags\_ 和 odagscnt\_ 前缀更有效。这使您能够测试值集是否为空。例如，在 MyField 中未进行选择时，以下操作比在 odag\_MyField 中测试所有值更有效：

```
WHERE ($(odagscnt_MyField)=0 OR MyColumn IN ($(odags_MyField)))
```

当并非按需字段的选择应用程序中有一个备选字段时，不能使用 odags\_。例如，如果用户在 CountryName 中进行选择，但绑定表达式在相关字段 CountryCode 上，则无法使用 odags\_。在这些情况下，可改为使用 odago\_。如果 odago\_ 绑定中没有值，则可能意味着要么应包含所有值，要么不应包含任何值。

## 绑定数值

在要绑定到 On-demand 应用程序的数据由数字（而非字符串）组成时，最好针对数值字段禁用加引号行为。例如，如果销售记录包含一个数值 DAY\_OF\_WEEK 列，并且您希望选择应用程序的用户选择 DAY\_OF\_WEEK 的任意组合，则可以增强用于加载选择应用程序的聚合查询，以便将 DAY\_OF\_WEEK 既包括在 SELECT 列表中又包括在 GROUP BY 列表中。如果在选择 DAY\_OF\_WEEK 值时在其两侧加引号，而且数据库不支持将字符串类型自动转换为数值，则可能会生成运行时查询错误。

要处理这种情况，可以使用绑定表达式后缀的数字版本。这将强制字段绑定使用选择应用程序中的数值，而不是字符串值。有以下数字版本可用：

* odagn\_
* odagon\_
* odagsn\_

通过使用数字版本，从存储选定值的双重值中的数字部分提取值，并且默认情况下这些值没有引号。

## 需要一定数量的选择项

在某些情况下，对于特定字段，可能必须要求 On-demand 应用程序查询中包含特定数量或特定范围的值。例如，如果 On-demand 应用程序的查询中包含 BETWEEN 子句（用来获取开始日期和结束日期之间的所有销售额），则 YEARQUARTER 字段的绑定表达式可以有一个后缀语法 [2]，该语法将要求为 YEARQUARTER 正好选择两个值，如下所示：

```
$(odag_YEARQUARTER)[2]
```

选择应用程序上的 On-demand 应用程序导航点将保持禁用状态，但前提是为 YEARQUARTER 选择的不是两个值。将显示一则消息来指示必须为 YEARQUARTER 正好选择两个值。

选择数量约束会在选择应用程序和 On-Demand 应用程序之间创建一个先决条件链接。这不同于未使用数量约束的绑定表达式。例如，当模板应用程序的脚本中包含绑定表达式而不包含数量约束（如下所示）时：

```
$(odag_MYFIELD)
```

既不要求选择应用程序包含名为 MYFIELD 的字段，又不要求为该字段选择任何值（如果该字段存在的话）。如果选择应用程序不包含名为 MYFIELD 的字段，或者用户只是忘了从中做出任何选择，则 On-demand 应用程序导航点仍可以在为了满足记录限制值条件而进行其他选择时变成启用状态。

另一方面，如果绑定表达式为：

$(odag\_MYFIELD)[1+]

现在会针对选择应用程序施加两个要求：

* 选择应用程序必须包含一个名为 MYFIELD 的字段。
* 用户必须至少为 MYFIELD 选择一个值。

在使用这种类型的绑定表达式时必须格外小心，因为它会限制哪些选择应用程序可以与模板应用程序一起使用。您不应当在模板应用程序的绑定上使用该数量限制，除非您确定自己希望将该选择数量要求应用在和该模板应用程序关联的所有选择应用程序上。

为了执行数据绑定过程，On-Demand 应用程序服务使用对脚本中的注释不敏感的字符串替代方式。这意味着您不应在注释中使用绑定表达式，除非在应用程序生成后您希望这些注释包含绑定值列表。注释中的任何绑定也将显示在 On-demand 应用程序生成链接的字段列表中，这可能是不可取的。

可能会施加其他数量约束。下表概述了选择数量约束的不同组合。

选择项数量约束的不同组合

| 约束模式 | 选择要求 |
| --- | --- |
| $(odag\_YEARQUARTER)[2] | 必须正好选择 2 个 YEARQUARTER 值。 |
| $(odag\_YEARQUARTER)[2-4] | 必须选择 2 到 4 个 YEARQUARTER 值。 |
| $(odag\_YEARQUARTER)[2+] | 必须至少选择 2 个 YEARQUARTER值。 |
| $(odag\_YEARQUARTER)[2-] | 最多只能选择 2 个 YEARQUARTER 值。 |

信息注释在应用程序生成过程期间执行了检查，确定是否达到模板应用程序中的所有数量限制。如果不符合数量限制，生成该应用程序的请求将被拒绝，并显示错误消息。

## 更改值引号字符和分隔符字符

将从选择应用程序选择的字段中的值列表插入到模板应用程序脚本中时，将使用单引号将值括起来并用逗号分隔。这些是引号和分隔符的默认字符。可在附加到每个字段的绑定语句的语法中更改这些值。例如：

$(odag\_ORIGIN){"quote": "|", "delimiter": ";"}

然后，在构造来自选择应用程序的绑定值列表时，将使用这些新值。例如，如果所选值是一年的前三个月，则会将列表构造为：

|January|;|February|;|March|

引号字符和分隔符字符的默认值适用于大多数标准 SQL 数据库。但这些值可能不适用于某些 SQL 数据库，也不适用于许多动态数据源（例如，NoSQL 和 REST）。对于这些源，需要附加此绑定表达式以更改引号字符和分隔符字符。

下表概述了用于更改引号和分隔符字符的格式参数。

格式参数

| 参数 | 默认值 | 定义 |
| --- | --- | --- |
| 引号 | '（单引号）用于文本前缀<br><br>对于数字前缀为空 | 将添加在每个值之前和之后 |
| 分隔符 | ,（逗号） | 将添加在所有值之间 |
| quoteReplace | ''（双单引号） | 当值不为空且引号不为空时，值中出现的所有引号都将替换为指定的字符串。<br><br>信息注释quoteReplace 不支持用作数字前缀（诸如 odagn\_.）的参数。quoteReplace 按数字前缀被忽略。 |
| noValue | 留空 | 如果没有为字段选择值，则将使用此值。当选择中没有特定字段的值时，此参数非常有用。<br><br>该值应设置为源数据中不存在的值。例如，对于数值，如果数据库中的所有值都为正值，则使用负值。<br><br>信息注释 对于没有引号的值，如果字段的选定值可以是空集，则必须指定 noValue。 |

下表概述了 odag\_ 和 odagn\_ 的格式规范和生成的值。生成的插入值基于 VAL1、VAL2 的默认数据值。

odag\_odag\_ 示例格式规格以及生成的值

| 格式规格 | 描述 | 生成的插入的值 |
| --- | --- | --- |
| 未指定 | 逗号分隔的值列表，带有引号 '。 | 'VAL1','VAL2' |
| {"quote": "", "delimiter": ""} | 串联值 | VAL1VAL2 |
| {"quote": "X", "delimiter": "Y"} | 由 X 引用并由 Y 限定的值。 | XVAL1XYXVAL2X |
| {"quote": "XX", "delimiter": "YY"} | 由 XX 引用并由 YY 限定的值。 | XXVAL1XXYYXXVAL2XX |
| {"quote": "X"} | 由 X 引用并由 ,（默认）限定的值。 | XVAL1X,XVAL2X |
| {"delimiter": "YY"} | 由 ' （默认）引用并由 YY 限定的值 | 'VAL1'YY'VAL2' |
| {"quote": ""} | 由 , 限定的不带引号的值。 | VAL1,VAL2 |
| {"quote": "A", "quoteReplace": "\\A"} | 由 A 引用并由逗号（默认）限定的值。字段内的值将由 \A 替代。<br><br>信息注释<br><br>在本例中，需要有双重 \ 因为 \ 是 json 格式的转义字符。 | AV\AL1A,AV\AL2A |

odagn\_odagn\_ 示例格式规格以及生成的值

| 格式规格 | 描述 | 生成的插入的值 |
| --- | --- | --- |
| 未指定 | 逗号分隔的没有引号的值列表。注意将使用数值。 | VAL1,VAL2 |
| {"delimiter": "YY"} | 由 YY 限定的不带引号的值 | VAL1YYVAL2 |
| {"quote": "A", "quoteReplace": "\\A"} | 与 odag\_ 前缀相比，将忽略 quoteReplace 参数。 | AVAL1A,AVAL2A |

## 处理单独值

当需要单独处理字段值时，可以使用内联方法在变量 Values 中生成值，并使用 Replace 或其他函数执行任意处理。在下面的示例中，Replace 结合占位符值使用。

MyTempBindingData: LOAD \* INLINE [VAL $(odag\_MyField){"quote": "", "delimiter": "\n"} ]; \_TempTable: LOAD Concat(chr(39) & Replace(text, from\_str, to\_str) & chr(39), ',') as CombinedData Resident MyTempBindingData; LET Values = Peek('CombinedData',0,'\_TempTable'); drop table \_TempTable; drop table MyTempBindingData;