Die SQL-Anweisung, die die Quelle eines Abfrage-Layers definiert, ist statisch. Es gibt jedoch einige Situationen, in denen Teile von SQL-Anweisungen nicht im Voraus bekannt sind. Wenn Sie beispielsweise aggregierten Niederschlag anzeigen, ist Ihnen möglicherweise nicht bekannt, ob der Kartenleser die Niederschlagswerte der Station nach Tag, Woche oder Monat aggregieren möchte. Durch die Parameter in Abfrage-Layern werden Komponenten der SQL-Anweisung dynamisch. Abfrageparameter stellen die Variable einer SQL-Anweisung dar, deren Wert beim Ausführen der Abfrage definiert wird. Die beiden folgenden Typen von Abfrageparametern sind verfügbar:
- Bereichsparameter verbinden numerische oder zeitliche Werte dynamisch mit dem Bereichsschieberegler und dem Zeitschieberegler. Stellen Sie sich beispielsweise eine SQL-Abfrage vor, die einen Bereichsparameter WHERE ::r:myRangeVar1 enthält. Die SQL-Abfrage, die an die Datenbank gesendet wird, lautet WHERE aField = value oder WHERE aField => value1 AND aField <= value2, je nachdem, ob ein oder zwei Werte vom Bereichsschieberegler übergeben werden.
- Diskontinuierliche Parameter aktualisieren eine Abfrage mit Literal-Werten, wenn die Abfrage ausgeführt wird. Stellen Sie sich beispielsweise eine SQL-Abfrage vor, die einen Abfrage-Layer definiert und zwei diskontinuierliche Parameter WHERE city_population > ::population AND state_name = ::name enthält. Wenn Werte wie 10000 bzw. California für den jeweiligen Parameter festgelegt werden, lautet die an die Datenbank gesendete SQL-Abfrage WHERE city_population > 10000 AND state_name = 'California'.
Hinweis:
Ein Abfrage-Layer wird durch eine SQL-Abfrage definiert, die Erstellen eines Abfrage-Layers festgelegt wird. Sie können einen Abfrage-Layer mit dem Geoverarbeitungswerkzeug Abfrage-Layer erstellen erstellen; mit diesem Werkzeug können jedoch keine Parameter definiert werden. Um Parameter in der SQL-Anweisung zu verwenden, ändern Sie den Abfrage-Layer im Dialogfeld Abfrage bearbeiten.
Wenn Sie einen Abfrage-Layer benötigen, mit dem Sie aggregierte Werte nach Datum, Uhrzeit oder numerischen Bereichen durchsuchen können, dann verwenden Sie das Geoverarbeitungswerkzeug Aggregations-Abfrage-Layer erstellen, um den Abfrage-Layer mit aktivierter dynamischer Aggregation zu erstellen und Abfrageparameter für die Anzeige Ihrer Ergebnisse zu definieren.
Bereichsparameter
Bereichsparameter arbeiten mit numerischen (Integer oder Double) oder mit Werten für Datum/Uhrzeit, um Daten dynamisch auf dem Zeit- oder Bereichsschieberegler anzuzeigen. Sie werden ohne Verweis auf ein Feld oder einen Ausdruck deklariert, und in der SQL-Abfrage werden keine logischen Operatoren verwendet. Stattdessen wird das Feld oder der Ausdruck als Eigenschaft des Parameters festgelegt. Bereichsparameter weisen das Schlüsselwort ::r: als Präfix auf. Sie verwenden Bereichsparameter, wenn die WHERE-Klausel der SQL-Abfrage auf Feldern basiert, die nicht Teil der SELECT-Liste sind.
Ein Beispiel dafür ist: WHERE ::r:MyRangeParameter
Beim Deklarieren einer Bereichsparameter müssen Sie ein Feld oder einen Ausdruck, den Datentyp und optional Standardwerte sowie einen Alias festlegen, der in den Schiebereglern verwendet werden soll. Klicken Sie auf Standardwert, um die minimalen und maximalen Standardwerte einzugeben. Wenn das Kontrollkästchen aktiviert ist, müssen Sie mindestens einen Wert eingeben, um den Ausdruck zu überprüfen. Die Standardwerte können Wert-Literale (eine tatsächliche Zahl bzw. ein tatsächliches Datum) oder ein Ausdruck sein, der einen Wert des angegebenen Datentyps zurückgibt.
Mit den folgenden Schritten wird erläutert, wie ein Bereichsparameter für eine Tabelle namens "Earthquakes" definiert wird, um Erdbeben anzuzeigen, die in den letzten sieben Tagen als Standardzeitraum aufgetreten sind, und wie dieser Zeitraum optional mit dem Zeitschieberegler geändert wird:
- Klicken Sie auf der Registerkarte Karte in der Gruppe Layer im Menü Daten hinzufügen auf Abfrage-Layer.
- Wählen Sie im Menü Verbindung eine Datenbankverbindung aus, oder erstellen Sie mit Neue Geodatabase-Verbindung eine Verbindung.
- Geben Sie im Feld Name Earthquakes ein.
- Geben Sie im Feld Abfrage select * from EARTHQUAKES where ::r:EQDateRange ein.
- Zeigen Sie mit der Maus auf den Parameter ::r:EQDateRange im Code, und klicken Sie auf Abfrage bearbeiten , um die Eigenschaften zu bearbeiten.
- Geben Sie die folgenden Parametereigenschaften ein:
- Geben Sie für Feld oder Ausdruck den Namen eines Datums-/Uhrzeitfeldes ein.
- Wählen Sie für Datentyp Datum aus.
- Aktivieren Sie die Option Standardwert.
- Geben Sie Standardwertausdrücke entsprechend der zugrunde liegenden Datenbank ein.
In der folgenden Tabelle finden Sie für einige der Datenbanken Beispiele. Eine vollständige Liste der Datenbanken, die für die Verwendung von Abfrage-Layer konfiguriert werden können, finden Sie unter Datenbank- und Client-Konfigurationen für Abfrage-Layer.
Datenbank Von-Wert Bis-Wert Microsoft SQL Server
dateadd(dd, -7, cast(getdate() as date)) cast(getdate() as date) Oracle
trunc(CURRENT_DATE) - INTERVAL '7' DAY trunc(CURRENT_DATE) PostgreSQL
CURRENT_DATE - INTERVAL '7 days' CURRENT_DATE - Klicken Sie auf Fertig.
- Klicken Sie auf Überprüfen, um sicherzustellen, dass die SQL-Abfrage und Bereichsdefinitionen gültig sind.
- Klicken Sie auf Weiter.
- Legen Sie die eindeutigen Kennungsfelder, den Geometrietyp und den Raumbezug fest, und klicken Sie auf Fertig stellen.
Nun können Sie mit dem Zeitschieberegler zu einem beliebigen Zeitraum navigieren und die Erdbeben anzeigen, die aufgetreten sind. Sie können auf die Schaltfläche Zeit deaktivieren klicken, um die Erdbeben innerhalb des festgelegten Standardzeitbereichs anzuzeigen, der sich in diesem Beispiel innerhalb der letzten sieben Tage befindet.
Vorsicht:
Sie können mehrere Bereichsparameter für einen Abfrage-Layer deklarieren, von denen jedoch nur einer auf Werte für Datum/Uhrzeit verweisen kann.
Erweiterte Eigenschaften für Bereichsparameter
Wenn die Überprüfung der Abfrage fehlschlägt, müssen Sie möglicherweise erweiterte Eigenschaften für die Bereichsparameter festlegen. Blenden Sie den Bereich Erweitert der Parametereigenschaften ein, um den Namen der Tabelle anzugeben, zu dem das Feld gehört. Dadurch können die Minimum- und Maximumwerte direkt aus der Tabelle abgerufen werden. Dies führt zu einer verbesserten Effizienz, insbesondere dann, wenn der Parameter sich in einer geschachtelten Abfrage befindet. Wenn keine Standardwerte angegeben wurden, müssen Sie außerdem unter der Überschrift Erweitert den Ausdruck angeben, der angegeben werden soll, wenn der Wert für den Parameter fehlt. Wählen Sie 1=1 (der Standardwert) aus, wodurch der Parameter im Ausdruck in 'TRUE' aufgelöst wird, oder 1=0, wodurch der Parameter in 'FALSE' aufgelöst wird.
Diskontinuierliche Parameter
Diskontinuierliche Parameter arbeiten mit numerischen (Integer oder Double), Datum- oder Zeichenfolgenwerten und haben das Schlüsselwort :: als Präfix. Sie werden mittels SQL-Operatoren mit einem Feld oder Ausdruck gekoppelt. Sie können den Feldwert aktualisieren, um die Daten zu filtern, die auf der Karte dargestellt werden.
Wenn Sie einen diskontinuierlicher Parameter deklarieren, müssen Sie einen Datentyp und Standardwerte festlegen. Um eine Liste der Optionen im Layer zur Laufzeit bereitzustellen, verwenden Sie den SQL-Operator IN und aktivieren Mehrere Werte zulassen. Legen Sie optional einen Alias fest, der anstelle des Parameternamens verwendet werden soll. Nachfolgend finden Sie einige Beispiele:
- WHERE aFieldName = ::var1
- WHERE AdminField IN ::AdminAgency
Vordefinierte diskontinuierliche Parameter
Sie können nicht nur eigene diskontinuierliche Parameter deklarieren, es gibt auch zwei vordefinierte diskontinuierliche Parameter, die Sie in Abfragen verwenden können. Mit dem Parameter view_extent wird ein räumlicher Filter für Ihre Abfrage angegeben. Er kann die Performance bei der Arbeit mit sehr großen Datasets erheblich verbessern. Mit dem Parameter view_scale können Sie in der Abfrage auf den aktuellen Kartenmaßstab zugreifen. Diese Variablen werden nur im Kontext einer 2D-Karte berücksichtigt. Sie werden in einer 3D-Szene ignoriert.
view_extent
Wenn ein Layer auf einer Karte angezeigt wird, ist der Abfrage, die an die Datenbank gesendet wird, am Ende der SQL-Abfrage ein räumlicher Filter angehängt. Dies ist ausreichend. Möglicherweise möchten Sie jedoch die Aggregation auf die Features beschränken, die in der aktuellen Ausdehnung sichtbar sind. In diesen Fällen können Sie den Parameter view_extent zur Abfrage hinzufügen, um sie räumlich auf die aktuelle Ausdehnung zu beschränken.
Sie können ::view_extent überall in der Abfrage und so oft wie erforderlich hinzufügen. Anders als bei benutzerdefinierten diskontinuierlichen Parametern müssen keine Eigenschaften festgelegt werden, und der Standardwert des Parameters ist NULL.
Die SQL-Abfrage, die an die Datenbank gesendet wird, ersetzt ::view_extent durch ein Polygon im WKT-Format (Well-Known Text) im gleichen Raumbezug wie der Layer. Verwenden Sie eine datenbankspezifische Funktion und eine Raumbezugs-ID (SRID), um die Geometrie aus dem WKT-Ausdehnungspolygon zu erstellen. Die folgenden Beispiele veranschaulichen dies für SQL Server- und PostgreSQL-Datenbanktypen:
- In SQL Server: WHERE shape.STWithin(geometry::STGeomFromText(::view_extent, 4326)) = 1
- In PostgreSQL: WHERE ST_Within(shape, ST_GeomFromText(::view_extent, 4326))
view_scale
Verwenden Sie den vordefinierten Parameter view_scale, wenn Sie basierend auf dem aktuellen Kartenmaßstab die Where-Klausel oder die ausgewählten Felder variieren möchten. Wenn Sie diesen Parameter verwenden, wird der Standardwert NULL übergeben. Andere Eigenschaften müssen nicht festgelegt werden. Sie können diesen Parameter so oft wie erforderlich zur SQL-Abfrage hinzufügen. Die folgenden Beispiele verwenden den Parameter view_scale in SQL Server- und PostgreSQL-Datenbanktypen:
- In SQL Server: WHERE IIF(::view_scale > 100000, <do this>, <do that>)
- In PostgreSQL: WHERE (CASE WHEN ::view_scale >= 100000 THEN <do this> WHEN ::view_scale >= 50000 AND ::view_scale < 100000 THEN <do that> ELSE <do the other thing> END)
Hinzufügen von Parametern zu einem Abfrage-Layer
Um der Abfrage einen Parameter hinzuzufügen, führen Sie die folgenden Schritte aus:
- Klicken Sie im Bereich Inhalt mit der rechten Maustaste auf den Layer, und klicken Sie auf Eigenschaften .
- Klicken Sie auf der Registerkarte Quelle in der Zeile Abfrage der Tabelle auf Abfrage bearbeiten .
Die Abfrage wird im Textfeld Abfrage ausgedrückt.
Tipp:
Um den Abfragetext besser lesen zu können, können Sie ihn vergrößern, indem Sie die STRG-Taste drücken während Sie das Mausrad vorwärts drehen.
- Positionieren Sie den Zeiger in den Code, und geben Sie ::r:<name> zur Eingabe eines Bereichsparameters oder ::<name> zur Eingabe einer diskontinuierlichen Parameters ein.
Parameter sind in der SQL-Abfrage fett formatiert, und neben ihnen befindet sich eine Schaltfläche Bearbeiten .
- Klicken Sie auf die Schaltfläche Bearbeiten, um auf Eigenschaften des Parameters zuzugreifen.
- Legen Sie die Parametereigenschaften fest, und klicken Sie auf Fertig.
Sie müssen einen Standardwert und einen Datentyp festlegen. Weitere Eigenschaften sind optional.
- Klicken Sie im Dialogfeld Abfrage bearbeiten auf Überprüfen, um sicherzustellen, dass keine Fehler vorhanden sind.
- Fahren Sie mit der Festlegung der räumlichen Eigenschaften für den Layer fort, und klicken Sie abschließend auf Fertig stellen.