这是一个高级主题,面向对 SQL 和 LookML 有扎实基础知识的用户。
Looker 会自动为用户提供通过创建过滤条件来操控查询的功能,这些过滤条件基于维度和度量。虽然此方法可满足许多使用情形,但无法满足所有分析需求。借助模板化过滤条件和 Liquid 参数,您可以支持的用例范围将大大扩展。
从 SQL 的角度来看,维度和指标只能更改查询中最外层的 WHERE 或 HAVING 子句。不过,您可能希望允许用户操纵 SQL 的其他部分。调整派生表的一部分、调整要查询的数据库表,或创建多用途的维度和过滤条件,这些只是您可以通过模板化过滤条件和 Liquid 参数启用的部分功能。
模板化过滤条件和 Liquid 参数使用 Liquid 模板语言将用户输入插入到 SQL 查询中。首先,您可以使用 LookML 参数创建一个供用户互动的字段。接下来,您可以使用 Liquid 变量将用户输入注入到 SQL 查询中。
示例
我们来看几个示例,以展示模板化过滤条件和 Liquid 参数的价值。
使用模板化过滤条件创建动态派生表
假设有一个派生表,用于计算东北区域客户的生命周期支出:
view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,                        -- Can be made a dimension
        SUM(sale_price) AS lifetime_spend   -- Can be made a dimension
      FROM
        order
      WHERE
        region = 'northeast'                -- Can NOT be made a dimension
      GROUP BY 1
    ;;
  }
}
在此查询中,您可以根据 customer_id 和 lifetime_spend 创建维度。不过,假设您希望用户能够指定 region,而不是将其硬编码为“东北”。region 无法作为维度公开,因此用户无法像往常一样根据它进行过滤。
一种方法是使用模板化过滤条件,如下所示:
view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,
        SUM(sale_price) AS lifetime_spend
      FROM
        order
      WHERE
        {% condition order_region %} order.region {% endcondition %}
      GROUP BY 1
    ;;
  }
  filter: order_region {
    type: string
  }
}
如需获取分步说明,请参阅基本用法部分。
使用 Liquid 参数创建动态指标
假设有一个过滤后的指标,用于统计售出的裤子数量:
measure: pants_count {
  filters: [category: "pants"]
}
这很简单,但如果类别有数十个,那么为每个类别创建指标就会很麻烦。此外,这还可能会让用户的“探索”体验变得杂乱无章。
另一种方法是创建如下所示的动态指标:
measure: category_count {
  type: sum
  sql:
    CASE
      WHEN ${category} = '{% parameter category_to_count %}'
      THEN 1
      ELSE 0
    END
  ;;
}
parameter: category_to_count {
  type: string
}
如需查看分步说明,请参阅基本用法部分。
基本用法
第 1 步:创建供用户互动的内容
- 对于模板化过滤条件,请添加 
filter。 - 对于 Liquid 参数,请添加 
parameter。 
无论哪种情况,这些字段都会显示在字段选择器的仅限过滤的字段部分中。
filter 和 parameter 字段都可以接受一系列子形参,让您可以自定义它们的操作方式。如需查看完整列表,请参阅字段参数文档页面。对于 parameter 字段,有两项选项需要特别提及。
首先,parameter 字段可以具有一种名为 unquoted 的特殊类型:
parameter: table_name {
  type: unquoted
}
此类型允许将值插入 SQL 中,而无需像字符串那样用引号括起来。当您需要插入表名等 SQL 值时,此功能非常有用。
其次,parameter 字段有一个名为允许的值的选项,可让您将用户友好的名称与要插入的值相关联。例如:
  parameter: sale_price_metric_picker {
    description: "Use with the Sale Price Metric measure"
    type: unquoted
    allowed_value: {
      label: "Total Sale Price"
      value: "SUM"
    }
    allowed_value: {
      label: "Average Sale Price"
      value: "AVG"
    }
    allowed_value: {
      label: "Maximum Sale Price"
      value: "MAX"
    }
    allowed_value: {
      label: "Minimum Sale Price"
      value: "MIN"
    }
  }
第 2 步:应用用户输入
第二步是使用 Liquid 添加所需的模板化过滤条件或 Liquid 参数。
模板化过滤条件
模板化过滤条件的语法分解如下:
{% condition filter_name %} sql_or_lookml_reference {% endcondition %}
condition和endcondition这两个字词永远不会改变。- 将 
filter_name替换为您在第一步中创建的过滤器的名称。如果您未创建仅限过滤的字段,也可以使用维度。 - 将 
sql_or_lookml_reference替换为应设置为“等于”用户输入的 SQL 或 LookML(本部分稍后会对此进行更详细的说明)。如果使用 LookML,请使用${view_name.field_name}LookML 语法。 
在前面的示例使用模板化过滤条件创建动态派生表中,我们使用了:
{% condition order_region %} order.region {% endcondition %}
请务必了解 Liquid 标记与您在标记之间编写的 SQL 之间的互动。这些模板化过滤条件标记始终会转换为逻辑表达式。例如,如果用户在 order_region 过滤条件中输入“东北”,Looker 会将这些标记转换为以下内容:
order.region = 'Northeast'
换句话说,Looker 会解读用户输入的内容,并生成相应的逻辑表达式。
由于模板化过滤条件会返回一个逻辑表达式,因此您可以将它们与 SQL WHERE 语句中有效的其他逻辑运算符和逻辑表达式搭配使用。沿用上一个示例,如果您想返回用户所选区域以外的所有值,可以在 WHERE 语句中使用以下代码:
NOT ({% condition order_region %} order.region {% endcondition %})
使用 LookML 字段作为过滤条件也是有效的。直接应用于 LookML 字段的任何过滤条件都将决定 WHERE 语句的值:
view: customer_facts {
  derived_table: {
    sql:
      SELECT
        customer_id,
        SUM(sale_price) AS lifetime_spend
      FROM
        order
      WHERE
        {% condition region %} order.region {% endcondition %}
      GROUP BY 1
    ;;
  }
  dimension: region {
    type: string
    sql: ${TABLE}.region ;;
}
Liquid 参数
Liquid 参数的语法分解如下:
{% parameter parameter_name %}
- 字词 
parameter永远不会更改。 - 将 
parameter_name替换为您在第一步中创建的parameter名称。 
例如,如需应用第 1 步中 parameter 字段的输入内容,您可以创建如下所示的度量:
  measure: sale_price_metric {
    description: "Use with the Sale Price Metric Picker filter-only field"
    type: number
    label_from_parameter: sale_price_metric_picker
    sql: {% parameter sale_price_metric_picker %}(${sale_price}) ;;
    value_format_name: usd
  }
在模板化过滤条件和 Liquid 参数之间进行选择
尽管模板化过滤条件和 Liquid 参数很相似,但两者之间存在一个重要区别:
如果您想为用户提供更灵活的输入方式(例如各种日期范围或字符串搜索),请尽可能使用模板化过滤条件。Looker 可以在后台解读用户输入并编写相应的 SQL。这样一来,您就不必考虑每种可能的用户输入类型。
在无法插入逻辑语句的情况下,或者在您知道用户可能会输入一组有限的选项时,请使用 Liquid 参数。