Anfang des Inhaltsbereichs

Zeilen auswählen Dokument im Navigationsbaum lokalisieren

Die WHERE-Klausel schränkt die Anzahl der selektierten Zeilen durch Bedingungen ein.

Diese Grafik wird im zugehörigen Text erklärt

Die WHERE-Klausel wird in Open SQL außer in der SELECT-Anweisung auch in den Anweisungen OPEN CURSOR, UPDATE und DELETE verwendet. Die allgemeine Form der WHERE-Klausel ist:

SELECT... WHERE <cond>...

Die Bedingungen <cond> der WHERE-Klausel sind Vergleiche und eine Reihe weiterer spezieller Ausdrücke. Mehrere Bedingungen können in der WHERE-Klausel z einer Bedingung verknüpft werden. Weiterhin können Bedingungen auch dynamisch programmiert werden.

Die Bedingungen <cond> der WHERE-Klausel sind oft ähnlich zu Logische Ausdrücken aber nicht identisch, da Syntax und Semantik sich nach Standard SQL richten. In den Bedingungen der WHERE-Klausel werden Spalten wie in der SELECT-Klausel durch einen Feldbezeichner benannt. Im folgenden bezeichnet <s> immer eine Spalte einer der Datenbanktabellen der FROM-Klausel. Das Ergebnis einer Bedingung kann wahr, falsch oder unbekannt sein. Nur falls die Bedingung wahr ist, wird die entsprechende Zeile selektiert, ansonsten nicht. Eine Bedingung ist unbekannt, falls eine beteiligte Spalte den Null-Wert enthält.

Vergleiche für alle Typen

Um den Wert einer Spalte beliebigen Datentyps mit einem anderen Wert zu vergleichen, schreibt man:

SELECT... WHERE <s> <operator> <f> ...

Für <f> kann eine andere Spalte einer Datenbanktabelle aus der FROM-Klausel, ein Datenobjekt oder eine skalare Subquery verwendet werden.

Für den Vergleichsoperator sind folgende Ausdrücke möglich:

<operator>

Bedeutung

EQ

gleich

=

gleich

NE

ungleich

<>

ungleich

><

ungleich

LT

kleiner

<

kleiner

LE

kleiner oder gleich

<=

kleiner oder gleich

GT

größer

>

größer

GE

größer oder gleich

>=

größer oder gleich

Die Werte der Operanden werden falls notwendig ineinander konvertiert und verglichen. Die Konvertierung kann von Plattform und Codepage abhängig sein.

Intervallzugehörigkeit

Um festzustellen, ob der Wert einer Spalte in einem Intervall liegt, schreibt man:

SELECT... WHERE <s> [NOT ] BETWEEN <f 1> AND <f 2>. ..

Die Bedingung ist wahr, wenn der Wert der Spalte <s> [nicht] zwischen den Werten der Datenobjekte <f1> und <f 2> liegt. Die Intervallzugehörigkeit kann nicht in der ON-Bedingung der FROM-Klausel geprüft werden.

Vergleiche für Zeichenketten

Um festzustellen, ob der Wert einer Spalte einem Muster entspricht, schreibt man:

SELECT... WHERE <s> [NOT ] LIKE <f> [ESCAPE <h>]. ..

Diese Bedingung ist wahr, wenn der Wert der Spalte <s> [nicht] dem Muster Im Datenobjekt <f> entspricht. kann nur für Textfelder verwendet werden. Der Datentyp der Spalte muß alphanumerisch sein. Der Datentyp von <f> muß vom Typ C sein.

In <f> können folgende Maskenzeichen verwendet werden:

Zum Beispiel paßt ABC_EFG% zu den Zeichenketten ABCxEFGxyz und ABCxEFG, aber nicht zu ABCEFGxyz. Um die beiden Maskenzeichen explizit in dem Vergleich zu verwenden, muß die ESCAPE-Option verwendet werden. Mit ESCAPE <h> wird ein Fluchtsymbol <h> definiert. Sowohl die Maskenzeichen, als auch das Fluchtsymbol selbst verlieren ihre spezielle Bedeutung im Muster <f>, wenn ihnen <h> vorangestellt wird. Die Verwendung der Maskenzeichen _ und % entspricht Standard-SQL. Logische Ausdrücke im sonstigen ABAP haben andere Maskenzeichen (+ und *).

Der Vergleich mit LIKE kann nicht in der ON-Bedingung der FROM-Klausel durchgeführt werden.

Werteliste überprüfen

Um festzustellen, ob der Wert einer Spalte in einer Werteliste enthalten ist, schreibt man:

SELECT... WHERE <s> [NOT ] IN (<f 1>,......, <f n>). ..

Diese Bedingung ist wahr, wenn der Wert der Spalte <s> [nicht] in der Werteliste <f1> … <f n> enthalten ist.

Subquery überprüfen

Um festzustellen, ob der Wert einer Spalte in der Selektion einer skalaren Subquery enthalten ist, schreibt man:

SELECT... WHERE <s> [NOT ] IN <subquery>. ..

Diese Bedingung ist wahr, falls der Wert von <s> [nicht] in der Ergebnismenge der skalaren Subquery <subquery> enthalten ist.

Um festzustellen, ob die Selektion einer Subquery überhaupt Zeilen enthält, schreibt man:

SELECT... WHERE [ NOT ] EXISTS <subquery>. ..

Diese Bedingung ist wahr, falls die Ergebnismenge der Subquery <subquery> mindestens eine [keine] Zeile enthält. In diesem Fall muß die Subquery nicht skalar sein.

Die Überprüfung einer Subquery kann nicht in der ON-Bedingung der FROM-Klausel durchgeführt werden.

Selektionstabelle überprüfen

Um festzustellen, ob der Wert einer Spalte den Bedingungen in einer Selektionstabelle genügt, schreibt man:

SELECT... WHERE <s> [NOT ] IN <seltab>. ..

Diese Bedingung ist wahr, falls der Wert von <s> [nicht] der Bedingung entspricht, die in den Zeilen von<seltab> abgelegt ist. <seltab> kann eine echte Selektionstabelle aber auch eine RANGES-Tabelle sein. Die Überprüfung einer Selektionstabelle kann nicht in der ON-Bedingung der FROM-Klausel durchgeführt werden.

Null-Wert abfragen

Um festzustellen, ob der Wert einer Spalte der Null-Wert ist, schreibt man:

SELECT... WHERE <s> IS [NOT ] NULL. ..

Diese Bedingung ist wahr, falls der Wert von <s> [nicht] der Null-Wert ist.

Bedingungen umkehren

Um das Ergebnis einer Bedingung umzukehren, schreibt man:

SELECT... WHERE NOT <cond>. ..

Diese Bedingung ist wahr, falls <cond> falsch ist und falsch, falls <cond> wahr ist. Das Ergebnis einer unbekannten Bedingung bleibt unbekannt.

Bedingungen verknüpfen

Zwei Bedingungen lassen sich jeweils mit den Operatoren AND und OR zu einer Bedingung verknüpfen:

SELECT... WHERE <cond 1> AND <cond 2>. ..

Diese Bedingung ist wahr, falls beide Operanden wahr sind.

SELECT... WHERE <cond 1> OR <cond 2>. ..

Diese Bedingung ist wahr, falls mindestens einer der Operanden wahr ist.

NOT bindet stärker als AND, und AND bindet stärker als OR. Der Ablauf der Verarbeitung kann aber durch Klammern gesteuert werden.

Dynamische Bedingungen

Um eine Bedingung dynamisch anzugeben, schreibt man:

SELECT... WHERE (<itab>). ..

Dabei ist <itab> eine interne Tabelle mit dem Zeilentyp C und einer der maximalen Länge von 72 Zeichen. Alle obigen Bedingungen außer der Überprüfung einer Selektionstabelle können in den Zeilen von <itab> abgelegt werden. Dabei dürfen aber nur Literale und keine Namen von Datenobjekten verwendet werden. Die Tabelle <itab> darf auch leer sein.

Um nur einen Teil einer Bedingung dynamisch anzugeben, schreibt man:

SELECT... WHERE <cond> AND (<itab>). ..

Eine Verknüpfung einer statischen mit einer dynamischen Bedingung durch OR ist nicht möglich.

Dynamischen Bedingungen dürfen nur in der WHERE-Klausel der SELECT-Anweisung verwendet werden.

Tabellenartige Bedingungen

Die WHERE-Klausel der SELECT-Anweisung hat eine spezielle Variante, die es erlaubt, Bedingungen aus den Zeilen und Spalten einer internen Tabelle abzuleiten. Diese Variante ist wie folgt:

SELECT... FOR ALL ENTRIES IN <itab> WHERE <cond> ...

Die Bedingung <cond> kann wie oben aufgeführt formuliert werden. Wenn als Operand einer Bedingung, ein Feld der internen Tabelle <itab> genannt wird, werden damit alle Zeilen der internen Tabelle <itab> angesprochen. Der Vergleich wird dann für jede einzelne Zeile der internen Tabelle ausgeführt. Für jede Zeile der internen Tabelle werden die Zeilen der Datenbanktabelle selektiert, welche die Bedingung erfüllen. Die Ergebnismenge der SELECT-Anweisung ist die Vereinigungsmenge der einzelnen Selektionen jeder Zeile der internen Tabelle. Dabei werden doppelte vorkommende Zeilen automatisch aus der Ergebnismenge entfernt. Falls die Tabelle <itab> leer ist, wird der Zusatz FOR ALL ENTRIES nicht berücksichtigt und es werden alle Einträge gelesen.

Die interne Tabelle <itab> muß einen strukturierten Zeilentyp haben und jedes Feld, daß in der Bedingung <cond> genannt wird, muß zu der Spalte der Datenbanktabelle kompatibel sein, mit der es verglichen wird. Die Operatoren LIKE, BETWEEN und IN sind in Vergleichen mit Feldern der internen Tabelle nicht erlaubt. Weiterhin darf nicht gleichzeitig die ORDER BY-Klausel verwendet werden..

Sie können den Zusatz FOR ALL ENTRIES verwenden, um geschachtelte SELECT-Schleifen durch Operationen mit internen Tabellen zu ersetzen, was bei großen Mengen von selektierten Daten zu signifikanten Performanceverbesserungen führt.

Beispiel

Bedingungen in der WHERE-Klausel.

... WHERE carrid = 'UA'.

Diese Bedingung ist wahr, wenn die Spalte CARRID den Inhalt UA hat.

... WHERE num GE 15.

Diese Bedingung ist wahr, wenn die Spalte NUM Zahlen größer oder gleich 15 enthält.

... WHERE cityfrom NE 'FRANKFURT'.

Diese Bedingung ist wahr, wenn die Spalte CITYFROM nicht die Zeichenkette FRANKFURT enthält.

... WHERE num BETWEEN 15 AND 45.

Diese Bedingung ist wahr, wenn die Spalte NUM Zahlen zwischen 15 und 45 enthält.

... WHERE num NOT BETWEEN 1 AND 99.

Diese Bedingung ist wahr, wenn die Spalte NUM Zahlen außerhalb 1 und 99 enthält.

... WHERE name NOT BETWEEN 'A' AND 'H'.

Diese Bedingung ist wahr, wenn die Spalte NAME ein Zeichen lang ist und der Inhalt alphabetisch außerhalb A und H liegt.

... WHERE city LIKE '%town%'.

Diese Bedingung ist wahr, wenn die Spalte CITY eine Zeichenkette enthält, die irgendwo das Muster 'town' enthält.

... WHERE name NOT LIKE '_n%'.

Diese Bedingung ist wahr, wenn die Spalte NAME kein 'n' an zweiter Stelle enthält.

... WHERE  funcname LIKE 'EDIT#_%' ESCAPE '#'.

Diese Bedingung ist wahr, wenn der Inhalt der Spalte FUNCNAME mit EDIT_ beginnt.

... WHERE city IN ('BERLIN', 'NEW YORK', 'LONDON').

Diese Bedingung ist wahr, wenn die Spalte CITY einen der Werte BERLIN, NEW YORK oder LONDON enthält.

... WHERE city NOT IN ('FRANKFURT', 'ROM').

Diese Bedingung ist wahr, wenn die Spalte CITY keinen der Werte FRANKFURT und ROM enthält.

... WHERE ( NUMbER = '0001' OR number = '0002') AND
      NOT ( country = 'F' OR country = 'USA').

Diese Bedingung ist wahr, wenn die Spalte NUMBER die Werte 0001 oder 0002 enthält und die Spalte COUNTRY weder F noch USA enthält.

Beispiel

Dynamische Bedingungen.

REPORT demo_select_dynamic_conditions.

DATA: cond(72) TYPE c,
      itab LIKE TABLE OF cond.

PARAMETERS: city1(10) TYPE c, city2(10) TYPE c.

DATA wa TYPE spfli-cityfrom.

CONCATENATE 'CITYFROM = ''' city1 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' city2 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' 'BERLIN' '''' INTO cond.
APPEND cond TO itab.

LOOP AT itab INTO cond.
  WRITE cond.
ENDLOOP.

SKIP.

SELECT  cityfrom
  INTO  wa
  FROM  spfli
  WHERE (itab).

  WRITE / wa.

ENDSELECT.

Wenn der Benutzer auf dem Standardselektionsbild 'Frankfurt' und 'Berlin' für die Parameter CITY1 und CITY2 eingibt, ist die Listenausgabe etwa wie folgt:

Diese Grafik wird im zugehörigen Text erklärt

Die ersten drei Zeilen stellen den Inhalt der internen Tabelle ITAB dar. Es werden genau die entsprechenden Tabellenzeilen selektiert.

Beispiel

Tabellenartige Bedingung.

REPORT demo_select_for_all_entries_1.

DATA: BEGIN OF line,
        carrid   TYPE spfli-carrid,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,
        cityto   TYPE spfli-cityto,
      END OF line,
      itab LIKE TABLE OF line.

line-cityfrom = 'FRANKFURT'.
line-cityto   = 'BERLIN'.
APPEND line TO itab.

line-cityfrom = 'NEW YORK'.
line-cityto   = 'SAN FRANCISCO'.
APPEND line TO itab.

SELECT  carrid connid cityfrom cityto
  INTO  CORRESPONDING FIELDS OF line
  FROM  spfli
  FOR ALL ENTRIES IN itab
  WHERE cityfrom = itab-cityfrom AND cityto = itab-cityto.

  WRITE: / line-carrid, line-connid, line-cityfrom, line-cityto.

ENDSELECT.

Die Listenausgabe ist in etwa:

Diese Grafik wird im zugehörigen Text erklärt

Es werden alle Zeilen ausgewählt, in denen folgende Bedingungen erfüllt sind:

Beispiel

Tabellenartige Bedingung.

REPORT demo_select_for_all_entries_2.

DATA: tab_spfli   TYPE TABLE OF spfli,
      tab_sflight TYPE SORTED TABLE OF sflight
                       WITH UNIQUE KEY table_line,
      wa LIKE LINE OF tab_sflight.

SELECT carrid connid
INTO   CORRESPONDING FIELDS OF TABLE tab_spfli
FROM   spfli
WHERE  cityfrom  = 'NEW YORK'.

SELECT  carrid connid fldate
  INTO  CORRESPONDING FIELDS OF TABLE tab_sflight
  FROM  sflight
  FOR ALL ENTRIES IN tab_spfli
  WHERE carrid = tab_spfli-carrid AND
        connid = tab_spfli-connid.

LOOP AT tab_sflight INTO wa.

  AT NEW connid.
    WRITE: / wa-carrid, wa-connid.
  ENDAT.

  WRITE: / wa-fldate.

ENDLOOP.

Die Listenausgabe ist in etwa:

Diese Grafik wird im zugehörigen Text erklärt

Es werden aus SFLIGHT zu allen Verbindungen die Flugdaten selektiert, bei denen in SPFLI die Spalte CITYFROM den Wert NEW YORK hat. Diese Selektion könnte mit einem Join in der FROM-Klausel auch in einer einzigen SELECT-Anweisung erfolgen.

 

 

Ende des Inhaltsbereichs