sql_where

Utilizzo

Explore: view_name_1 {
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Gerarchia
sql_where
Valore predefinito
Nessuna

Accetta
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.