sql_where

Uso

explore: view_name_1 {
  join: view_name_2 {
    sql_where: ${view_name_1.id} < 100 ;;
  }
}

Hierarchy
sql_where
Default Value
None

Accepts
A SQL WHERE clause

Definition

sql_where lets you apply a query restriction that users cannot change. The restriction will be inserted into the WHERE clause of the underlying SQL that Looker generates if and only if the join is used in the query. In addition to queries run by human users, the restriction will apply to dashboards, scheduled Looks, and embedded information that relies on that Explore.

The condition can be written in pure SQL, using your database's actual table and column names. It can also use Looker field references like ${view_name.field_name}, which is the preferred method, because Looker can be smarter about automatically including necessary joins. A sql_where condition is not displayed to the user, unless they look at the underlying SQL of any queries that they create.

Example

For example, you can specify that if the join to users is used, that only users younger than 50 should be included:

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
  }
}

Se o usuário selecionar Orders.Count e Users.Count, o SQL que o Looker geraria com base nesse LookML será:

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

Informações importantes

Os parênteses são obrigatórios se você estiver usando a lógica OR.

Se você usar a lógica OR com sql_where, é muito importante colocar parênteses na condição SQL. Por exemplo, em vez de escrever:

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

Você escreveria isto:

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

Se você esquecer de adicionar os parênteses neste exemplo e um usuário adicionar o próprio filtro, a cláusula WHERE gerada poderá ter a seguinte forma:

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

Nessa situação, o filtro aplicado pelo usuário pode não funcionar. De qualquer forma, as linhas com company = 'Altostrat' vão aparecer, porque a condição AND é avaliada primeiro. Sem parênteses, apenas parte da condição sql_where é combinada com o filtro do usuário. Se parênteses fossem adicionados, a cláusula WHERE ficaria assim:

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

Agora, o filtro do usuário será aplicado a todas as linhas.

A ordem de junção é importante para dependências sql_where

Em geral, o Looker implementa junções na ordem correta, independente da ordem em que elas são definidas no LookML. A exceção é com sql_where. Se você fizer referência a um campo de outra junção na sua instrução sql_where, a junção referenciada precisará ser definida antes da instrução sql_where na LookML.

Por exemplo, esta é uma instrução sql_where que faz referência ao campo inventory_items.id antes de inventory_items ser unido:

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} ;;
  }
}

Se você executar uma consulta nessa Análise, o Looker vai retornar um erro informando que o campo inventory_items.id não foi encontrado.

No entanto, é possível resolver esse problema reordenando as junções para que a junção referenciada na instrução sql_where seja definida antes da instrução sql_where, assim:

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 ;;
  }
}

Isso evita o erro porque a junção inventory_items é definida antes que o campo inventory_items.id seja referenciado na instrução sql_where da junção order_items.

A restrição de consulta sql_where só é aplicada se a junção for usada.

A restrição de consulta especificada em sql_where será inserida na cláusula WHERE do SQL subjacente que o Looker gera se e somente se a junção for usada na consulta. Se você quiser aplicar uma cláusula "where" mesmo que a junção não tenha sido usada, use sql_always_where.