Funktion SELECT

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

SYNTAX

Weiterhin verwenden können Sie allerdings die normalen Klammern.
  • Ausschließlich für den COUNT-Parameter können Sie den Wert des folgenden Ausdrucks als einfaches Sternchen (*) angeben.
  • Verwendung

    Die SELECT-Funktion ist 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 und:
    • Das gekennzeichnete Feld wird als eine "Zeile" in einer Tabelle betrachtet.
    • Die gleichgeordneten Elemente werden als weitere "Zeilen" derselben "Tabelle" behandelt.
    • Die untergeordneten Elemente des Feldes werden 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 i.d.R. eine weitere Nachrichtenbaumstruktur mit "Zeilen", deren Struktur und Inhalt durch den Ausdruck SelectClause 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 SelectClause 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 eine einzelne Feldreferenz 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 bewertet. 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 SelectClause 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 verstanden.

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

    Enthält die FROM-Klausel mehrere Feldreferenzen, 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 SelectClause auf eine Feldreferenz oder um die Umsetzung einer Feldreferenz handelt, wird der Name des Feldes verwendet.
    2. Anderenfalls verwendet der Broker die Standardnamen "Spalte1", "Spalte2" usw..

    INSERT-Auswahl

    Die INSERT-Klausel ist eine Alternative zur AS-Klausel. Sie weist das Ergebnis des Ausdrucks SelectClause (muss eine Zeile sein) der aktuellen neuen Zeile zu - nicht einem untergeordneten Element der Zeile. Dabei wird das Zeilenergebnis des Ausdrucks in die Zeile einzufügen, 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 SelectClause 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 SelectClause 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 "aller 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 *
    SELECT A.*
    SELECT A FROM Database.Datasource.SchemaName.Table

    SELECT-Ausdrücke angeben

    SelectClause
    SelectClause-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
    AS Pfad-Ausdrücke können 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
    Umwandeln einer einfachen XML-Nachricht
    Umwandeln einer komplexen XML-Nachricht
    Rückgabe eines skalaren Wertes in einer XML-Nachricht
    Ü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, 2005 Letzte Aktualisierung: Nov 17, 2005
    ak05620_