sql_where

用量

探索:view_name_1 {
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
层次结构
sql_where
默认值


接受
SQL WHERE 子句

定义

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

可以使用数据库的实际表和列名称以纯 SQL 写入条件。它还可以使用 Looker 字段引用(如 ${view_name.field_name}),这是首选方法,因为 Looker 可以更加智能地自动包含必要的联接。sql_where 条件不会向用户显示,除非他们查看自己创建的任何查询的底层 SQL。

示例

例如,您可以指定在使用“联接”选项时,仅包含未满 50 周岁的用户:

explore: orders_users_under_50 {
  view_name: orders

  join: users {
    sql_on: ${users.id} = ${orders.user_id} ;;
    sql_where: ${users.age} < 50 ;;
    type: left_outer
  }
}

-

如果用户选择 Orders.CountUsers.Count,Looker 将通过此 LookML 生成的 SQL 为:

SELECT
  COUNT(orders.id) AS orders_count,
  COUNT(DISTINCT users.id, 1000) AS users_count
FROM thelook2.orders AS orders
LEFT JOIN thelook2.users AS users ON users.id = orders.user_id

WHERE users.age < 50
LIMIT 500

注意事项

如果您使用 OR 逻辑,则必须使用括号

如果您将 OR 逻辑与 sql_where 搭配使用,请务必用 SQL 括号括住括号。例如,不要这样编写:

sql_where: region = 'Northeast' OR company = 'Periaptly' ;;

-

您会这样写:

sql_where: (region = 'Northeast' OR company = 'Periaptly') ;;

-

在此示例中,如果您忘记添加括号,而用户自行添加了过滤条件,则生成的 WHERE 子句可能会采用以下格式:

WHERE
  user_filter = 'something' AND
  region = 'Northeast' OR
  company = 'Periaptly'

在这种情况下,用户应用的过滤条件可能不起作用。无论如何,系统都会显示具有 company = 'Periaptly' 的行,因为首先会计算 AND 条件。如果没有括号,则只有 sql_where 条件的一部分会与用户的过滤条件合并。如果添加了括号,则 WHERE 子句将如下所示:

WHERE
  user_filter = 'something' AND
  (region = 'Northeast' OR company = 'Periaptly')

现在,系统会对每一行应用用户的过滤条件。

联接顺序对于 sql_where 依赖项非常重要

一般来说,无论联接在 LookML 中的定义顺序如何,Looker 都会按正确的顺序实现联接。sql_where 属于例外情况。如果您在 sql_where 语句中引用另一个联接中的字段,则必须在 LookML 中的 sql_where 语句之前定义您要引用的联接。

例如,以下 sql_where 语句引用 inventory_items 加入之前的 inventory_items.id 字段:

explore: orders {
  hidden: yes
  join: order_items {
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    sql_where: ${inventory_items.id} IS NOT NULL ;;
  }
  join: inventory_items {
    sql_on: ${inventory_items.id}=${order_items.inventory_item_id} ;;
  }
}

如果您在此“探索”中运行查询,Looker 将返回错误,表明找不到 inventory_items.id 字段。

不过,为解决此问题,您可以对联接重新排序,使 sql_where 语句中引用的联接在 sql_where 语句之前定义,如下所示:

explore: orders {
  hidden: yes
  join: inventory_items {
    sql_on: ${inventory_items.id}=${order_items.inventory_item_id} ;;
  }
join: order_items {
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    sql_where: ${inventory_items.id} IS NOT NULL ;;
  }
}

这可以防止出错,因为 inventory_items 联接是在 order_items 联接的 sql_where 语句中引用 inventory_items.id 字段之前定义的。

仅在使用联接时应用 sql_where 查询限制

当且仅当查询中使用联接时,在 sql_where 中指定的查询限制才会插入到 Looker 生成的底层 SQL 的 WHERE 子句中。如果您希望在未使用联接的情况下应用 where 子句,请改用 sql_always_where