SELECT-Funktion

Die SELECT-Funktion kombiniert, filtert und wandelt komplexe Nachrichten und Datenbankdaten um.

SYNTAX

Anmerkungen:
  1. Die Klammern sind in SELECT-Ausdrücken nicht mehr erforderlich. Normale Klammern können weiterhin verwendet werden. Vorhandene Klammern dienen der Zuordnung von Ausdrücken.
  2. Ausschließlich für den COUNT-Parameter können Sie als Wert für den folgenden Ausdruck einen einzelnen Stern (*) angeben.

Verwendung

Die SELECT-Funktion ist die gängigste und effizienteste Art der Umwandlung von Nachrichten. Mit der SELECT-Funktion können Sie Folgendes ausführen:
  • Umfangreiche Neuformatierung von Nachrichten
  • Zugriff auf Datenbanktabellen
  • Erstellung einer Ausgabefeldgruppe als Untergruppe einer Eingabefeldgruppe
  • Erstellung einer Ausgabetabelle, die nur die Werte der Eingabetabelle enthält
  • Zählen der Einträge in einer Feldgruppe
  • Auswählen des Mindest- oder Maximalwertes aus mehreren Einträgen in einer Feldgruppe
  • Summieren der Werte in einer Feldgruppe

Einführung in die SELECT-Funktion

Für die SELECT-Funktion besteht eine Nachrichtenbaumstruktur (oder eine untergeordnete Baumstruktur) aus mehreren "Zeilen" und "Spalten", vergleichbar mit einer Datenbanktabelle. Eine Feldreferenz in einer FROM-Klausel kennzeichnet ein Feld in einer Nachrichtenbaumstruktur. Außerdem wird
  • das gekennzeichnete Feld als eine "Zeile" in einer Tabelle betrachtet.
  • die gleichgeordneten Elemente als weitere "Zeilen" derselben "Tabelle" behandelt.
  • die untergeordneten Elemente des Feldes als "Spalten" der Tabelle betrachtet.
Anmerkung: Die Feldreferenz in einer FROM-Klausel kann auch eine Tabellenreferenz sein, die direkt auf eine echte Datenbanktabelle verweist.

Der Rückgabewert der SELECT-Funktion ist in der Regel eine weitere Nachrichtenbaumstruktur mit "Zeilen", deren Struktur und Inhalt durch den Ausdruck SELECT-Klausel bestimmt wird. Die Anzahl der Zeilen im Ergebnis ist die Summe aller "Zeilen", auf die von allen Feld- und Tabellenreferenzen in der FROM-Klausel verwiesen wird, gefiltert durch die WHERE-Klausel. Nur Felder, für die die WHERE-Klausel den Wert TRUE ermittelt, werden eingeschlossen.

Der Rückgabewert der SELECT-Funktion kann auch skalar sein (siehe ITEM-Auswahl).

Sie können den Ausdruck SELECT-Klausel auf verschiedene Arten festlegen. Die entsprechenden Informationen finden Sie unter:

Einfache Auswahl

Zum besseren Verständnis der Funktionsweise der SELECT-Funktion folgt nun ein einfaches Fallbeispiel:
  • SelectClause besteht aus mehreren Ausdrücken, jeder davon mit der Pfad-Klausel AS.
  • Die FROM-Klausel enthält einen einzelnen Feldverweis und die Korrelationsname-Klausel AS.
Die SELECT-Funktion erstellt eine lokale Referenz-Korrelationsvariable, die ihren Namen von der Korrelationsname-Klausel AS erhält und dann schrittweise alle "Zeilen" der Liste mit den Zeilen durchläuft, die aus der FROM-Klausel abgeleitet wurden. Für jede "Zeile" gilt:
  1. Die Korrelationsvariable ist so eingerichtet, dass sie auf die aktuelle "Zeile" verweist.
  2. Die WHERE-Klausel (falls vorhanden) wird ausgewertet. Ergibt sie den Wert FALSE oder Unbekannt (Null), wird der Ergebnisbaumstruktur nichts hinzugefügt, und die nächste "Zeile" der Eingabe wird verarbeitet. Anderenfalls fährt die Verarbeitung mit dem nächsten Schritt fort.
  3. Der Ergebnisliste wird ein neues Mitglied hinzugefügt.
  4. Die Ausdrücke der SELECT-Klausel werden bewertet und Feldern zugewiesen, deren Namen die Pfad-Klausel AS vorgibt. Diese Felder sind untergeordnete Felder des neuen Mitglieds der Ergebnisliste.

Für gewöhnlich greifen die Ausdrücke von SELECT-Klausel und der WHERE-Klausel mit der Korrelationsvariablen auf "Spaltenwerte" zu (d. h. Felder in der Baumstruktur der Eingabenachricht) und erstellen so eine neue Nachrichtenbaumstruktur, die Daten aus der Eingabenachricht enthält. Auf die Korrelationsvariable wird von dem in der Korrelationsname-Klausel AS angegebenen Namen verwiesen - bzw., wenn keine AS-Klausel angegeben ist, von der Feldreferenz FROM (d. h. der Name nach dem letzten Punkt).

Beachten Sie Folgendes:
  • Trotz der Ähnlichkeit mit einer Tabelle sind Sie nicht darauf beschränkt, Nachrichten mit einer flachen, tabellenähnlichen Struktur aufzurufen oder zu erstellen. Sie können Strukturen mit beliebig tiefen Ordnerstrukturen aufrufen und erstellen.
  • Sie sind nicht auf eine "Spalte" als Einzelwert beschränkt - eine Spalte kann ein wiederholter Listenwert oder eine Struktur sein.
Diese Konzepte werden am besten mit der Hilfe von Beispielen verständlich.

Wenn es sich bei dem Feldverweis eigentlich um einen Tabellenverweis handelt, ist die Funktionsweise sehr ähnlich. In diesem Fall handelt es sich bei der Eingabe um eine echte Datenbanktabelle. Sie ist daher auf die flachen, von Datenbanken unterstützten Strukturen beschränkt. Die Ergebnisbaumstruktur unterliegt jedoch weiterhin keinen sonderlichen Einschränkungen.

Enthält die FROM-Klausel mehrere Feldverweise, durchläuft die Referenz ganz rechts jede ihrer Zeilen für die Zeilen in der danebenliegenden Referenz usw. Die Gesamtanzahl der Zeilen im Ergebnis ist also das Produkt der Anzahl der Zeilen in jeder Tabelle. Eine solche Auswahl wird auch als Verknüpfung bezeichnet und verwendet für gewöhnlich eine WHERE-Klausel, die die meisten dieser Zeilen aus dem Ergebnis ausschließt. Mit Verknüpfungen werden normalerweise Datenbankdaten zu Nachrichten hinzugefügt.

Die Pfad-Klausel AS ist optional. Ist sie nicht angegeben, generiert der Broker gemäß den folgenden Regeln einen Standardnamen:
  1. Wenn es sich bei dem Ausdruck SELECT-Klausel auf einen Feldverweis oder um die Umsetzung eines Feldverweises handelt, wird der Name des Feldes verwendet.
  2. Anderenfalls verwendet der Broker die Standardnamen "Spalte1", "Spalte2" usw.

Beispiele

Im nachfolgenden Beispiel wird die SELECT-Funktion in der Tabelle "Parts" des Schemas"Shop" in der Datenbank "DSN1" ausgeführt. Da keine WHERE-Klausel vorhanden ist, werden alle Zeilen ausgewählt. Da die Ausdrücke der SELECT-Klausel (z. B. P.PartNumber) keine AS-Klauseln enthalten, übernehmen die Felder im Ergebnis dieselben Namen:

SET PartsTable.Part[] = SELECT
  P.PartNumber,
  P.Description,
  P.Price
 FROM Database.DSN1.Shop.Parts AS P;

Ist das Ziel der SET-Anweisung ("PartsTable") eine Variable vom Typ ROW (Reihe), zeigt 'PartsTable' nach Ausführung der Anweisung als untergeordnete Elemente seines Stammelements für jede Tabellenreihe ein Feld namens "Part" an. Alle "Part"-Felder besitzen die untergeordneten Felder "PartNumber", "Description" und "Price". Die Werte der untergeordneten Felder werden wiederum vom Inhalt der Tabelle vorgegeben. ("PartsTable" könnte auch ein Verweis auf eine Nachrichtenbaumstruktur sein).

Im nächsten Beispiel wird eine ähnliche SELECT-Funktion ausgeführt. Im Unterschied zum vorherigen Beispiel wird diese SELECT-Funktion jedoch in der Nachrichtenbaumstruktur ausgeführt, die im ersten Beispiel erstellt wurde (und nicht in einer realen Datenbanktabelle). Das Ergebnis wird einem Unterordner von "OutputRoot" zugewiesen:

SET OutputRoot.XML.Data.TableData.Part[] = SELECT
  P.PartNumber,
  P.Description,
  P.Price
 FROM PartsTable.Part[] AS P;

INSERT-Auswahl

Die INSERT-Klausel ist eine Alternative zur AS-Klausel. Sie weist das Ergebnis des Ausdrucks SELECT-Klausel (muss eine Zeile sein) der aktuellen neuen Zeile zu - nicht einem untergeordneten Element der Zeile. Dabei wird das Zeilenergebnis des Ausdrucks in die Zeile eingefügt, die von der SELECT-Funktion generiert wird. Der Unterschied zur AS-Klausel besteht darin, dass diese immer mindestens ein untergeordnetes Element generiert, bevor sie ein Ergebnis hinzufügt, während die INSERT-Klausel kein solches Element generiert. Die INSERT-Klausel ist nützlich, wenn Daten aus anderen SELECT-Operationen eingefügt werden, da die Daten ohne zusätzliche Ordner zusammengeführt werden können.

ITEM-Auswahl

Der Ausdruck SELECT-Klausel kann aus dem Schlüsselwort ITEM und einem einzelnen Ausdruck bestehen. Dabei werden die Ergebnisse namenlos gemacht, d. h., das Ergebnis ist keine Zeile, sondern eine Liste mit Werten des Typs, den der Ausdruck zurückgegeben hat. Diese Option hat verschiedene Verwendungen:
  • Zusammen mit einem skalaren Ausdruck und der THE-Funktion kann sie eine SELECT-Abfrage erstellen, die einen einzelnen skalaren Wert zurückgibt (z. B. den Preis eines bestimmten Artikels aus einer Tabelle).
  • Zusammen mit einem CASE-Ausdruck und ROW-Konstruktoren kann sie eine SELECT-Abfrage erstellen, die Nachrichten erstellt oder bearbeitet, in denen sich die Struktur einiger "Zeilen" (Wiederholungen in der Nachricht) von anderen unterscheidet. Dies ist bei der Bearbeitung von Nachrichten mit sich wiederholenden Strukturen nützlich, in denen jedoch nicht alle Wiederholungen dieselbe Struktur haben.
  • Zusammen mit einem ROW-Konstruktor kann sie eine SELECT-Abfrage erstellen, die die Wiederholungsebenen in der Eingabenachricht komprimiert.

Spaltenfunktionsauswahl

Der Ausdruck SELECT-Klausel kann aus einer der Funktionen COUNT, MAX, MIN und SUM bestehen, die in einem Ausdruck ausgeführt werden. Diese Funktionen werden auch als Spaltenfunktionen bezeichnet. Sie geben einen einzelnen skalaren Wert zurück (keine Liste), der Anzahl, Maximum, Minimum oder Summe der Werte angibt, die für diesen Ausdruck beim Durchlaufen der Zeilen der FROM-Klausel ermittelt wurden. Wenn der Ausdruck für eine bestimmte Reihe den Wert NULL ermittelt hat, wird der Wert ignoriert, so dass die Funktion Anzahl, Maximum, Minimum oder Summe der verbleibenden Zeilen zurückgibt.

Der Ausdruck kann ausschließlich für die COUNT-Funktion aus einem einzelnen Sternchen (*) bestehen. Diese Form zählt die Zeilen auch unabhängig von Nullwerten.

Damit das Ergebnis eine nützliche Wiedergabe der Eingabenachricht ist, schließt der Ausdruck für gewöhnlich die Korrelationsvariable mit ein.

Üblicherweise ermittelt der Ausdruck für jede Zeile denselben Datentyp. In diesen Fällen hat das Ergebnis der Funktionen MAX, MIN und SUM denselben Datentyp wie die Operanden. Die Rückgabewerte müssen jedoch nicht alle denselben Typ haben. In diesem Fall (d. h. unterschiedliche Typen) gelten die normalen Regeln der Arithmetik. Wenn z. B. ein Feld in einer sich wiederholenden Nachrichtenstruktur ganzzahlige Werte für einige Zeilen und variable Werte für andere Zeilen enthält, folgt die Summe den normalen Regeln der Addition. Sie hätte den Typ "Variable", da die Operation dem Addieren einer Ganzzahl und Variablen entspricht.

Das Ergebnis der COUNT-Funktion ist immer eine Ganzzahl.

Unterschiede zwischen Nachricht- und Datenbankauswahl

FROM-Ausdrücke, in denen eine Korrelationsvariable eine Zeile in einer Nachricht darstellt, zeigen ein etwas anderes Verhalten als Ausdrücke, in denen die Korrelationsvariable eine Zeile in einer echten Datenbanktabelle darstellt.

Im Nachrichtenfall hat ein Pfad mit einem Sternchen (*) eine normale Bedeutung; er ignoriert den Feldnamen und sucht nach dem ersten Feld, das den anderen Kriterien (falls vorhanden) entspricht.

Im Datenbankfall hat ein Sternchen (*) aus historischen Gründen die Sonderbedeutung "alle Felder". Diese Sonderbedeutung erfordert tiefere Kenntnisse der Definition der Datenbanktabelle und wird nur unterstützt, wenn die Standarddatenbank abgefragt wird (d. h. die Datenbank, auf die das Attribut Datenquelle des Knotens verweist). Beispielsweise werden bei den folgenden Abfragen nur Name/Wert-Paare für Spalten zurückgegeben, wenn die Standarddatenbank abgefragt wird:
SELECT * FROM Database.Datasource.SchemaName.Table As A
SELECT A.* FROM Database.Datasource.SchemaName.Table As A
SELECT A FROM Database.Datasource.SchemaName.Table AS A

SELECT-Ausdrücke angeben

SELECT-Klausel
SELECT-Klausel-Ausdrücke können alle Operatoren und Funktionen des Brokers in beliebiger Kombination verwenden. Sie können auf Tabellenspalten, Nachrichtenfelder, auf von enthaltenen SELECT-Funktionen deklarierte Korrelationsnamen sowie auf jede andere deklarierte Variable oder Konstante verweisen, die im Gültigkeitsbereich liegt.
AS Pfad
Ein AS-Pfadausdruck ist zwar ein relativer Pfad (d. h., es gibt keinen Korrelationsnamen), unterliegt aber ansonsten keinerlei Einschränkungen. Es kann beispielsweise Folgendes enthalten:
  • Indizes (z. B. A.B.C[i])
  • Feldtyp-Spezifikatoren (z. B. A.B.(XML.Attribute)C )
  • Mehrteilige Pfade (z. B. A.B.C )
  • Namensausdrücke (z. B. A.B.{var})

Alle Ausdrücke in diesen Pfaden können auch alle Operatoren und Funktionen des Brokers in beliebiger Kombination verwenden. Die Ausdrücke können auf Tabellenspalten, Nachrichtenfelder, auf von enthaltenen SELECT-Funktionen deklarierte Korrelationsnamen sowie auf jede andere deklarierte Variable oder Konstante verweisen.

FROM-Klausel
FROM-Klauselausdrücke können mehrere Datenbankreferenzen, mehrere Nachrichtenreferenzen oder eine Mischung aus beiden enthalten. Sie können Tabellen mit Tabellen, Nachrichten mit Nachrichten oder Tabellen mit Nachrichten verknüpfen.

Feldreferenzen von FROM-Klauseln können Ausdrücke aller Art enthalten (z. B. Database.{DataSource}.{Schema}.Table1).

Sie können bei Laufzeit ein Feld, eine Datenquelle, ein Schema oder einen Tabellennamen berechnen.

WHERE-Klausel

Der WHERE-Klauselausdruck kann alle Operatoren und Funktionen des Brokers in beliebiger Kombination verwenden. Er kann auf Tabellenspalten, Nachrichtenfelder und auf jede andere deklarierte Variable oder Konstante verweisen.

Beachten Sie jedoch, dass der Broker den WHERE-Klauselausdruck untersucht und entscheidet, ob der gesamte Ausdruck von der Datenbank bewertet werden kann. Wenn dies der Fall ist, wird er an die Datenbank übergeben. Damit ein Ausdruck von der Datenbank ausgewertet wird, darf er nur die von der Datenbank unterstützten Funktionen und Operatoren enthalten.

Die WHERE-Klausel kann jedoch auf Nachrichtenfelder, auf von enthaltenen SELECT-Funktionen deklarierte Korrelationsnamen sowie auf jede andere deklarierte Variable oder Konstante verweisen, die im Gültigkeitsbereich liegt.

Kann die Datenbank den gesamten Ausdruck nicht bewerten, sucht der Broker auf höchster Ebene nach AND-Operatoren und untersucht jeden Unterausdruck einzeln. Anschließend versucht er, die auswertbaren Unterausdrücke an die Datenbank zu übergeben. Alle übrigen werden vom Broker ausgewertet.Diese Vorgehensweise ist aus zwei Gründen zu beachten:
  1. Scheinbar harmlose Änderungen von Ausdrücken in einer WHERE-Klausel können die Leistung erheblich beeinflussen. Sie können ermitteln, ein wie großer Teil des Ausdrucks an die Datenbank übergeben wurde, indem Sie einen Benutzertrace auswerten.
  2. Das Verhalten einiger Datenbankfunktionen weicht leicht vom Verhalten des Brokers ab.

Beziehung zur THE-Funktion

Zusammen mit der SELECT-Funktion und der THE-Funktion (gibt das erste Element einer Liste zurück) ermitteln Sie ein Ergebnis, das keine Liste ist. Dies ist z. B. nützlich, wenn eine SELECT-Abfrage erforderlich ist, um nur ein Element zurückzugeben. Besonders hilfreich ist dies zusammen mit ITEM (siehe ITEM-Auswahl).

Abweichungen vom SQL-Standard

Die ESQL-Anweisung SELECT unterscheidet sich in folgenden Punkten von der Datenbank-SQL-Anweisung SELECT:
  • ESQL kann Ergebnisdaten mit Baumstruktur erstellen.
  • ESQL kann Feldgruppen in SELECT-Klauseln akzeptieren
  • ESQL verfügt über die THE-Funktion und die Parameter ITEM und INSERT.
  • ESQL verfügt in diesem Release über keine SELECT ALL-Funktion.
  • ESQL verfügt in diesem Release über keine ORDER BY-Funktion.
  • ESQL verfügt in diesem Release über keine SELECT DISTINCT-Funktion.
  • ESQL verfügt in diesem Release über keine GROUP BY- oder HAVING-Parameter.
  • ESQL verfügt in diesem Release über keine AVG-Spaltenfunktion.

Einschränkungen

Das aktuelle Release unterliegt folgenden Einschränkungen:
  • Wenn ein SELECT-Befehl in mehreren Datenbanktabellen ausgeführt wird, müssen sich alle Tabellen in derselben Datenbankinstanz befinden. (Die Tabellenverweise müssen also keine unterschiedlichen Datenquellnamen angeben.)
  • Wenn die FROM-Klausel auf Nachrichten und Tabellen verweist, müssen die Tabellen den Nachrichten in der Liste vorangestellt sein.
Zugehörige Konzepte
Übersicht zu ESQL
Zugehörige Tasks
ESQL erstellen
Einfache XML-Nachricht umwandeln
Komplexe XML-Nachricht umwandeln
Skalarwert in einer XML-Nachricht zurückgeben
Über ESQL auf Datenbanken zugreifen
Zugehörige Verweise
Syntaxdiagramme: verfügbare Typen
Komplexe ESQL-Funktionen
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
ak05620_