sql_where

Nutzung

Explore: view_name_1 {
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Hierarchie
sql_where
Standardwert
Keine

Akzeptiert
Eine SQL-WHERE-Klausel

Definition

Mit sql_where können Sie eine Abfrageeinschränkung anwenden, die Nutzer nicht ändern können. Die Einschränkung wird nur dann in die WHERE-Klausel des zugrunde liegenden SQL-Codes eingefügt, wenn Looker in der Abfrage verwendet wird. Neben den von menschlichen Benutzern ausgeführten Abfragen gilt diese Beschränkung für Dashboards, geplante Looks und eingebettete Informationen, die auf dieses Explore zurückgreifen.

Die Bedingung kann in reinem SQL mit den tatsächlichen Tabellen- und Spaltennamen Ihrer Datenbank geschrieben werden. Es kann auch Looker-Feldverweise wie ${view_name.field_name} verwenden, die bevorzugt wird, weil Looker notwendige Joins automatisch verknüpfen kann. Eine sql_where-Bedingung wird dem Nutzer nur dann angezeigt, wenn er sich den zugrunde liegenden SQL-Code aller von ihm erstellten Abfragen ansieht.

Beispiel

Sie können beispielsweise festlegen, dass nur Nutzer unter 50 Jahren eingeschlossen werden sollen, wenn die Funktion „Mit Nutzern verknüpfen“ verwendet wird:

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
  }
}

-

Wenn der Nutzer Orders.Count und Users.Count auswählt, wird der SQL-Code, den Looker aus diesem LookML generiert, so aussehen:

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

Wichtige Punkte

Wenn Sie die OR-Logik verwenden, sind Klammern erforderlich.

Wenn Sie die OR-Logik mit sql_where verwenden, ist es sehr wichtig, die SQL-Bedingung mit Klammern zu versehen. Beispiel:

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

-

In diesem Fall würden Sie so schreiben:

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

-

Wenn Sie in diesem Beispiel vergessen haben, die Klammern hinzuzufügen, und ein Nutzer seinen eigenen Filter hinzugefügt hat, könnte die generierte WHERE-Klausel das folgende Format haben:

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

In diesem Fall funktioniert der Filter, den der Nutzer angewendet hat, möglicherweise nicht. Unabhängig davon, was passiert, werden Zeilen mit company = 'Periaptly' angezeigt, da die UND-Bedingung zuerst ausgewertet wird. Ohne Klammern wird nur ein Teil der sql_where-Bedingung mit dem Filter des Nutzers kombiniert. Wenn Klammern hinzugefügt werden, sieht die WHERE-Klausel stattdessen so aus:

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

Jetzt wird der Filter auf jede Zeile angewendet.

Join-Reihenfolge ist für sql_where-Abhängigkeiten wichtig

Im Allgemeinen implementiert Looker Joins in der richtigen Reihenfolge, unabhängig von der Reihenfolge, in der die Joins in LookML definiert werden. Hiervon ausgenommen ist sql_where. Wenn Sie in Ihrer sql_where-Anweisung auf ein Feld eines anderen Joins verweisen, muss der Verweis, auf den Sie verweisen, vor der sql_where-Anweisung in LookML definiert werden.

Hier ist beispielsweise eine sql_where-Anweisung, die auf das Feld inventory_items.id verweist, bevor inventory_items verknüpft wurde:

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} ;;
  }
}

Wenn Sie eine Abfrage in „Erkunden“ ausführen, gibt Looker eine Fehlermeldung zurück, dass das Feld inventory_items.id nicht gefunden werden kann.

Sie können dieses Problem jedoch beheben, indem Sie die Joins so neu anordnen, dass der in der sql_where-Anweisung referenzierte Join vor der Anweisung sql_where so definiert ist:

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 ;;
  }
}

Dadurch wird der Fehler vermieden, da der Join inventory_items definiert ist, bevor in der sql_where-Anweisung des Joins order_items auf das Feld inventory_items.id verwiesen wird.

Die Abfrageeinschränkung sql_where wird nur angewendet, wenn der Join verwendet wird

Die in sql_where angegebene Abfrageeinschränkung wird in die WHERE-Klausel des zugrunde liegenden SQL-Codes eingefügt, den Looker generiert, wenn der Join in der Abfrage verwendet wird. Wenn Sie eine Wo-Klausel auch dann anwenden möchten, wenn der Join nicht ausgeführt worden wäre, verwenden Sie stattdessen sql_always_where.