Uso
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Hierarquia
sql_where |
Valor padrão
NenhumaAceita
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