sql_where

Uso

explore: view_name_1 {
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Hierarquia
sql_where
Valor padrão
Nenhuma

Aceita
Uma cláusula WHERE SQL

Definição

sql_where permite aplicar uma restrição de consulta que os usuários não podem mudar. A restrição será inserida na cláusula WHERE do SQL subjacente gerado pelo Looker se e somente se a mesclagem for usada na consulta. Além das consultas feitas por usuários humanos, a restrição se aplica a painéis, aparências programadas e informações incorporadas que dependem desse recurso.

A condição pode ser escrita em SQL puro, usando os nomes reais da coluna e da tabela do banco de dados. Ele também pode usar referências de campo do Looker, como ${view_name.field_name}, que é o método recomendado, porque o Looker pode ser mais inteligente ao incluir automaticamente as mesclagens necessárias. Uma condição sql_where não é exibida para o usuário, a menos que ele consulte o SQL subjacente de qualquer consulta criada por ele.

Exemplo

Por exemplo, você pode especificar que, se a mesclagem com usuários for usada, somente usuários menores de 50 anos forem incluídos:

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 gerado pelo Looker ML 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

Considerações

Parênteses são necessários se você estiver usando a lógica OR.

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

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

-

Você escreveria:

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

-

Se você se esqueceu de adicionar os parênteses neste exemplo e um usuário adicionou o próprio filtro, a cláusula WHERE gerada pode ter o formato:

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

Nessa situação, o filtro aplicado pelo usuário pode não funcionar. Não importa o que aconteça, as linhas com company = 'Periaptly' serão exibidas, 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 = 'Periaptly')

Agora, o filtro do usuário será aplicado a cada linha.

A ordem de mesclagem é importante para as dependências de sql_where

Em geral, o Looker implementa as mesclagens na ordem correta, independentemente da ordem em que elas são definidas no LookML. A exceção é com sql_where. Se você referenciar um campo de outra mesclagem na instrução sql_where, a mesclagem que será referenciada precisa ser definida antes da instrução sql_where no LookML.

Por exemplo, veja uma instrução sql_where que faz referência ao campo inventory_items.id antes da mesclagem de 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} ;;
  }
}

Se você executar uma consulta em "Explorar", o Looker retornará um erro informando que o campo inventory_items.id não foi encontrado.

No entanto, você pode resolver esse problema reordenando as junções de maneira que a mesclagem referenciada na instrução sql_where seja definida antes da instrução sql_where, desta forma:

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 mesclagem inventory_items é definida antes da referência do campo inventory_items.id na instrução sql_where da mesclagem order_items.

A restrição de consulta sql_where será aplicada somente se a mesclagem for usada

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