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

Si el usuario selecciona Orders.Count y Users.Count, el código SQL que Looker generaría a partir de este LookML es el siguiente:

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

Aspectos para tener en cuenta

Se requieren paréntesis si usas la lógica de OR.

Si usas la lógica OR con sql_where, es muy importante que coloques paréntesis alrededor de la condición SQL. Por ejemplo, en lugar de escribir esto:

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

Escribirías lo siguiente:

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

Si olvidaste agregar los paréntesis en este ejemplo y un usuario agregó su propio filtro, la cláusula WHERE generada podría tener la siguiente forma:

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

En esta situación, es posible que el filtro que aplicó el usuario no funcione. De todos modos, se mostrarán las filas con company = 'Altostrat', ya que la condición AND se evalúa primero. Sin paréntesis, solo una parte de la condición sql_where se combina con el filtro del usuario. Si se agregaran paréntesis, la cláusula WHERE se vería de la siguiente manera:

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

Ahora se aplicará el filtro del usuario a cada fila.

El orden de unión es importante para las dependencias de sql_where

En general, Looker implementa las uniones en el orden correcto, independientemente del orden en que se definan en LookML. La excepción a esto es con sql_where. Si haces referencia a un campo de otra unión en tu instrucción sql_where, la unión a la que haces referencia debe definirse antes de tu instrucción sql_where en LookML.

Por ejemplo, aquí se muestra una declaración sql_where que hace referencia al campo inventory_items.id antes de que se una inventory_items:

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

Si ejecutas una consulta en esta exploración, Looker devolverá un error que indica que no se puede encontrar el campo inventory_items.id.

Sin embargo, puedes solucionar este problema reordenando tus uniones de modo que la unión a la que se hace referencia en la instrucción sql_where se defina antes de la instrucción sql_where, de la siguiente manera:

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

Esto evitará el error porque la unión inventory_items se define antes de que se haga referencia al campo inventory_items.id en la instrucción sql_where de la unión order_items.

La restricción de la consulta sql_where solo se aplica si se usa la unión.

La restricción de la consulta especificada en sql_where se insertará en la cláusula WHERE del SQL subyacente que genera Looker si y solo si se usa la unión en la consulta. Si quieres que se aplique una cláusula where incluso si no se hubiera usado la unión, usa sql_always_where en su lugar.