用量
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.Count
和 Users.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
。