sql_always_where

用量

探索:探索名称 {
sql_always_where: ${created_date} >= '2017-01-01' ;
}
层次结构
sql_always_where
默认值


接受
使用维度名称和/或 SQL 列名称的 SQL WHERE 条件

特殊规则
如果您在 sql_always_where 中引用某个属于联接视图的 SQL 列名称,而不是作为“探索”的一部分,则务必使用 always_join 参数 - 或者引用字段名称

定义

sql_always_where 允许您应用用户无法更改的查询限制。对于使用 sql_always_where探索中的所有查询,此限制将插入到 Looker 生成的底层 SQL 的 WHERE 子句中。除了人工用户执行的查询之外,此限制将适用于信息中心、预定的样式以及依赖于该探索的嵌入式信息。

可以使用数据库的实际表和列名称以纯 SQL 写入条件。它还可以使用如下所示的 Looker 引用:

  • ${view_name.SQL_TABLE_NAME}:引用其他 Looker 视图或派生表。请注意,此参考中的 SQL_TABLE_NAME 是一个字面量字符串;您无需将其替换为任何内容。
  • ${view_name.field_name},引用 Looker 字段。与直接引用 SQL 列相比,最好使用此方法,因为 Looker 可以自动添加任何必要的联接。

sql_always_where 条件不会向用户显示,除非他们查看自己创建的任何查询的底层 SQL。

示例

禁止用户在 2012 年 1 月 1 日之前查看订单:

# Using Looker references
explore: order {
  sql_always_where: ${created_date} >= '2012-01-01' ;;
}

# Using raw SQL
explore: order {
  sql_always_where: DATE(created_time) >= '2012-01-01' ;;
}

禁止用户查看 Periaptly Corporation 的客户信息:

explore: customer {
  sql_always_where: ${name} <> 'Periaptly Corporation' ;;
}

禁止用户查看 Periaptly Corporation 的订单:

explore: order {
  sql_always_where: ${customer.name} <> 'Periaptly Corporation' ;;
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

常见挑战

如果您使用原始 SQL,则可能需要使用 always_join

如果您在 sql_always_where 中引用某个属于联接视图的 SQL 列名称,而非使用探索功能,请务必使用 always_join 参数。请参考下面的示例:

explore: order {
  sql_always_where: customer.name <> 'Periaptly Corporation' ;;
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

在本例中,sql_always_where 引用了合并后的 customer 视图中的列,而不是 order 探索。由于 sql_always_where 将应用于每个查询,因此必须在每个查询中联接 customer

在为查询生成 SQL 时,Looker 会尝试尽可能创建最简洁的 SQL,并且只会使用用户选择的字段所必需的联接。在这种情况下,只有用户选择客户字段后,Looker 才会加入 customer。无论使用何种方式,您都可以使用 always_join 强制联接。

如果使用 sql_always_where: ${customer.name} <> 'Periaptly Corporation' 代替 sql_always_where: customer.name <> 'Periaptly Corporation',Looker 会变得足够智能,能够让 customer 加入,而无需您使用 always_join。因此,我们建议您尽可能使用 Looker 字段引用,而不是原始 SQL 引用。

每个探索只能使用一个sql_always_where

一个 explore 定义中只能有一个 sql_always_where。根据需要使用 ANDOR 将所需的所有行为放入单个 sql_always_where 中。

注意事项

SQL HAVING 子句有类似的参数

sql_always_where 非常相似的参数 sql_always_having 的工作方式相同,但对 HAVING 子句而不是 WHERE 子句应用条件。

如果您希望用户可以更改过滤条件,但无法移除,请考虑always_filter

如果您希望强制用户使用一组特定的过滤条件,但默认值可以更改,则可以改用 always_filter

如果您需要更改无法更改的针对具体用户的过滤条件,请考虑使用access_filter

如果您希望“探索”页面具有特定于每位用户的过滤条件,并且无法以任何方式更改,则可以使用 access_filter