Utilizzo
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Gerarchia
sql_where |
Valore predefinito
NessunaAccetta
Una clausola SQL WHERE |
Definizione
sql_where
consente di applicare una limitazione per le query che gli utenti non possono modificare. La restrizione verrà inserita nella clausola WHERE
dell'SQL sottostante generato da Looker se e solo se nella query viene utilizzato il join. Oltre alle query eseguite da utenti, la limitazione si applica alle dashboard, ai Look pianificati e alle informazioni incorporate che si basano su Esplora.
La condizione può essere scritta in SQL puro, utilizzando i nomi effettivi di tabelle e colonne del database. Può anche utilizzare i riferimenti ai campi di Looker, come ${view_name.field_name}
, che è il metodo preferito, perché Looker può essere più intelligente nel campo dell'inclusione automatica delle unioni necessarie. Una condizione sql_where
non viene mostrata all'utente, a meno che non esamini il codice SQL sottostante di eventuali query che crea.
Esempio
Ad esempio, puoi specificare che, se viene utilizzata l'unione con gli utenti, devono essere inclusi solo gli utenti di età inferiore ai 50 anni:
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 l'utente seleziona Orders.Count
e Users.Count
, l'SQL generato da Looker a partire da questo LookML è:
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
Aspetti da considerare
Le parentesi sono obbligatorie se utilizzi la logica OR
Se utilizzi la logica OR con sql_where
, è molto importante inserire le parentesi attorno alla condizione SQL. Ad esempio, anziché scrivere questo:
sql_where: region = 'Northeast' OR company = 'Periaptly' ;;
-
Potresti scrivere questo:
sql_where: (region = 'Northeast' OR company = 'Periaptly') ;;
-
Se hai dimenticato di aggiungere le parentesi in questo esempio e un utente ha aggiunto il proprio filtro, la clausola WHERE
generata potrebbe avere il seguente formato:
WHERE
user_filter = 'something' AND
region = 'Northeast' OR
company = 'Periaptly'
In questa situazione, il filtro applicato dall'utente potrebbe non funzionare. In ogni caso, vengono visualizzate le righe con company = 'Periaptly'
, perché la condizione AND viene valutata per prima. Senza parentesi, solo una parte della condizione sql_where
si combina con il filtro dell'utente. Se fossero aggiunte parentesi, la clausola WHERE
avrebbe invece il seguente aspetto:
WHERE
user_filter = 'something' AND
(region = 'Northeast' OR company = 'Periaptly')
Ora il filtro dell'utente verrà applicato a ogni riga.
L'ordine di partecipazione è importante per le dipendenze sql_where
In generale, Looker implementa le unioni nell'ordine corretto, indipendentemente dall'ordine in cui sono definite in LookML. L'unica eccezione è sql_where
. Se fai riferimento a un campo di un altro join nella tua istruzione sql_where
, l'unione a cui fai riferimento deve essere definita prima dell'istruzione sql_where
in LookML.
Ad esempio, ecco un'istruzione sql_where
che fa riferimento al campo inventory_items.id
prima che inventory_items
sia stato unito:
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 esegui una query in Explore (Esplora), Looker restituisce un errore che indica che non è possibile trovare il campo inventory_items.id
.
Tuttavia, puoi risolvere il problema riunendo le unioni in modo che l'unione a cui si fa riferimento nell'istruzione sql_where
venga definita prima dell'istruzione sql_where
, in questo modo:
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 ;;
}
}
In questo modo, verrà impedito l'errore perché l'unione inventory_items
è definita prima che venga fatto riferimento al campo inventory_items.id
nell'istruzione sql_where
dell'unione order_items
.
La limitazione per le query sql_where
viene applicata solo se viene usato il join
La limitazione per le query specificata in sql_where
verrà inserita nella clausola WHERE
dell'SQL sottostante generato da Looker se e solo se nella query viene utilizzato il join. Se vuoi applicare una clausola Dove anche se il join non è stato utilizzato, usa invece sql_always_where
.