Nutzung
join: view_name_2 {
sql_where: ${view_name_1.id} < 100 ;;
}
}
Hierarchie
sql_where |
Standardwert
KeineAkzeptiert
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
.