sql_where

Uso

explore: view_name_1 {
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Jerarquía
sql_where
Valor predeterminado
Ninguna

Acepta
Una cláusula WHERE de SQL

Definición

sql_where te permite aplicar una restricción de consulta que los usuarios no pueden cambiar. La restricción se insertará en la cláusula WHERE del SQL subyacente que Looker generará solo si la combinación se usa en la consulta. Además de las consultas que ejecuten los usuarios, la restricción se aplicará a los paneles, la apariencia incorporada y los aspectos programados que dependan de esa exploración.

La condición se puede escribir en SQL puro con los nombres de columna y tabla reales de tu base de datos. También puede usar referencias de campo de Looker, como ${view_name.field_name}, que es el método preferido, ya que Looker puede ser más inteligente al momento de incluir automáticamente las uniones necesarias. No se muestra una condición sql_where al usuario, a menos que mire el SQL subyacente de las consultas que crea.

Ejemplo

Por ejemplo, puedes especificar que, si se usa la unión a usuarios, se incluyan solo los usuarios menores de 50 años:

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 SQL que generaría Looker 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

Los paréntesis son obligatorios si usas la lógica OR.

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

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

-

Esto se escribiría así:

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

-

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

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

En este caso, es posible que el filtro que aplicó el usuario no funcione. Independientemente de lo que suceda, se mostrarán las filas con company = 'Periaptly', ya que primero se evalúa la condición AND. Sin paréntesis, solo una parte de la condición sql_where se combina con el filtro del usuario. Si se agregaron paréntesis, la cláusula WHERE se vería así:

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

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

El orden de unión es importante para sql_where dependencias

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

Por ejemplo, esta es una sentencia 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 Explorar, Looker mostrará un error que indica que no se puede encontrar el campo inventory_items.id.

Sin embargo, puedes resolver este problema si reordenas las uniones para que la unión a la que se hace referencia en la sentencia sql_where se defina antes de la declaració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 sentencia sql_where de la unión order_items.

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

La restricción de consulta especificada en sql_where se insertará en la cláusula WHERE del SQL subyacente que Looker generará solo si la combinación se usa 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.