

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 比较控件
<a name="custom-comparison-controls"></a>

在 SQL 中，文字比较将数据集中的一列与直接键入到查询中的文字值进行匹配。列比较将来自两个不同列的值相互匹配，无论是在同一个表中还是在联接的表中。

## 默认 行为
<a name="custom-comparison-defaults"></a>

比较控件是一个允许列表。设置后`allowedLiteralComparisonColumns`，只能将列出的列与文字值进行比较，并且您未列出的每列都会被屏蔽。这同样适用于列与列`allowedColumnComparisonColumns`的比较。将一列添加到一个许可列表不会将其添加到另一个许可列表中。

如果您未进行配置`comparisonControls`，则不 AWS Clean Rooms 应用任何比较限制，查询可以将任何列与文字值或另一列进行比较。

如果您未配置`comparisonControls`但设置了最低聚合阈值，则比较将不受其他限制。但是， AWS Clean Rooms 决不允许对中`identityColumns`列出的列进行字面比较。该限制来自阈值本身，因此无论您是否配置比较控件，它都适用。有关更多信息，请参阅 [最低聚合阈值](custom-min-agg-thresholds.md)。

如果将不允许的输出列`comparisonControls`一起配置，则这两个控件是独立的，并且都适用。比较控件控制查询可以比较哪些列；不允许的输出列决定哪些列可以出现在查询结果中。在比较中可以允许某一列，但仍不允许显示在结果中。有关更多信息，请参阅 [不允许的输出列](disallowed-output-columns.md)。

## 字面比较
<a name="custom-literal-comparison"></a>

文字比较根据单个硬编码常量（字符串、数字或日期）对列进行评估。在查询执行期间，运算符的右侧永远不会改变。语法示例包括：
+ WHERE状态 = '活跃'
+ WHERE价格 > 49.99

使用时[最低聚合阈值](custom-min-agg-thresholds.md)， AWS Clean Rooms 不允许对`identityColumns`值进行文字比较。这可以防止查询运行器提交向下筛选的个人或特定用户组的查询。避免允许对可能挑出小组或单个数据主体的低基数列进行文字比较。

```
{
  "comparisonControls": {
    "allowedLiteralComparisonColumns": [
      "status",
      "price"
    ]
  }
}
```

**选择用于文字比较的列**  
仅允许对无法识别个人或小群体的列进行文字比较。避免允许在低基数列（例如 age\_band、粗略区域代码）上使用它。尽管这些列不是配置`identityColumns`值，但将它们与文字进行比较可以将结果范围缩小到一小部分可识别的群体。 High-cardinality，非识别性维度，例如`campaign_id`或`product_sku`是更安全的选择。

### 示例：允许对广告系列专栏进行字面比较
<a name="custom-literal-comparison-example"></a>

发布者使用最低聚合阈值配置自定义分析规则，以便每个输出行代表至少 100 个不同的用户 (`user_id`)。广告商根据此表进行查询，但需要将分析范围限定为特定的广告活动，例如，一次衡量一个广告活动的覆盖面。

由于`user_id`是身份列，因此无法将其与文字进行比较，这使广告商无法将结果筛选到单个用户。但是`campaign_id`和`event_date`是高基数、不可识别的维度，因此发布商将它们添加到其中`allowedLiteralComparisonColumns`，这使广告商可以按广告系列进行筛选，并将分析范围缩小到某个日期范围：

```
{
  "aggregationThresholds": [
    {
      "identityColumns": ["user_id"],
      "minimumIdentityCount": 100
    }
  ],
  "comparisonControls": {
    "allowedLiteralComparisonColumns": ["campaign_id", "event_date"]
  }
}
```

鉴于前面的配置，允许以下查询：

```
-- Allowed: campaign_id and event_date are both in allowedLiteralComparisonColumns
SELECT campaign_id, COUNT(DISTINCT user_id) AS reach
FROM impressions
WHERE campaign_id = 'CMP-1024'
  AND event_date >= '2026-01-01'
GROUP BY campaign_id;
```

如果配置相同，则此查询会被阻止：

```
-- Blocked: user_id is the identity column and can never be compared to a literal
SELECT campaign_id, COUNT(DISTINCT user_id) AS reach
FROM impressions
WHERE user_id = 'U-88231'
GROUP BY campaign_id;
```

第一个查询仍然只返回由至少 100 个不同用户支持的行，而文字比较`campaign_id`和`event_date`筛选了考虑哪些行。第二个查询被拒绝，因为它试图挑出单个数据主体。

## 栏目对比
<a name="custom-column-comparison"></a>

列比较会针对每行动态评估一列的值与另一列的值。语法示例包括：
+ WHERE零售价格 < 批发价格
+ WHEREusers.id = 订单用户名

使用时[最低聚合阈值](custom-min-agg-thresholds.md)，数据提供者可以允许对需要跨表联接的用例（例如受众重叠报告）的`identityColumns`值进行列比较。

```
{
  "comparisonControls": {
    "allowedColumnComparisonColumns": [
      "user_id"
    ]
  }
}
```

### 示例：允许对重叠报告的标识列进行列比较
<a name="custom-column-comparison-example"></a>

出版商和广告商希望衡量其受众重叠程度，即两个数据集中出现的用户数量，而双方都不想知道任何个人用户是谁。这需要将两个表连接起来`user_id`，这是一种列与列的比较。发布商允许广告商进行针对特定广告活动 ID 的受众重叠分析。

因为`user_id`是身份列，出版商已经屏蔽了对该列的文字比较（因此没有人可以筛选到特定的人）。要启用跨表联接，发布者会添加`user_id`到`allowedColumnComparisonColumns`。要启用广告活动筛选，发布商会添加`campaign_id`到`allowedLiteralComparisonColumns`。

```
{
  "aggregationThresholds": [
    {
      "identityColumns": ["user_id"],
      "minimumIdentityCount": 100
    }
  ],
  "comparisonControls": {
    "allowedLiteralComparisonColumns": ["campaign_id"],
    "allowedColumnComparisonColumns": ["user_id"]
  }
}
```

鉴于前面的配置，允许以下查询：

```
-- Allowed: user_id is compared against another column (column-to-column join)
SELECT COUNT(DISTINCT p.user_id) AS overlapping_users
FROM publisher_audience p
  JOIN advertiser_audience a
ON p.user_id = a.user_id;
```

如果配置相同，则此查询会被阻止：

```
-- Blocked: email is not in allowedColumnComparisonColumns
SELECT COUNT(DISTINCT p.user_id) AS overlapping_users
FROM publisher_audience p
  JOIN advertiser_audience a
  ON p.email = a.email;
```

联接之所以成功，是因为列与列的比较是对每行进行动态评估，并且不让查询运行器将目标设定为已知值。结果强制执行最低聚合阈值，确保仅当重叠数代表至少 100 个不同用户时才返回重叠数。第二个查询被屏蔽，因为`email`不在`allowedColumnComparisonColumns`许可名单中，也不能用于比较，`user_id`只能使用。

## 比较控件和表达式
<a name="custom-comparison-expressions"></a>

比较控件遵循间接文字比较，而不仅仅是直接WHERE`column = 'literal'`谓词。如果您允许`ANY_EXPRESSION`内部聚合函数通过`allowedAggregateExpressionType`，则比较控件仍会阻止对不在`allowedLiteralComparisonColumns`的列上进行文字比较。即使文字嵌套在表达式中，这也适用。

以下示例显示了一个由于`zip_code`不在许可列表中而仍处于屏蔽状态的查询，尽管该字面量位于CASE表达式内而不是作为直接谓词编写：

```
-- Blocked: zip_code is not in allowedLiteralComparisonColumns,
-- even though the literal comparison is nested inside a CASE expression
SELECT SUM(CASE WHEN zip_code = '00001' THEN salary ELSE 0 END) AS total
FROM employees;
```

这就是为什么这两个控件是互补的：允许在聚合体内使用表达式可以拓宽查询的计算范围，而比较控件仍然限制查询可以按值挑出哪些列。有关更多信息，请参阅 [允许在聚合函数中嵌套表达式](custom-min-agg-thresholds.md#custom-min-agg-nested-expressions)。