Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

IN-Prädikat (Elementabfrage)

Es wird bestimmt, ob eine Zeile in einer Tabelle vorkommt.


{ zeile_1 [NOT] IN { unterabfrage_2 | ( zeile_2 , ...) } |

    vektor_spalte [NOT] IN ( ausdruck , ...) }

zeile_1 ::= { ( ausdruck ,...) | ausdruck | unterabfrage_1 }

zeile_2 ::= { ( ausdruck ,...) | ausdruck }

vektor_spalte ::= [ tabelle .] { spalte[min..max] | spalte ( min..max ) }



zeile_1

liefert eine Zeile.

Jeder ausdruck in zeile_1 muss einfach sein. Die Zeile besteht aus den Werten von ausdruck in der angegebenen Reihenfolge. Ein einzelner ausdruck liefert also eine Zeile mit einer Spalte.


unterabfrage_1

muss eine Tabelle liefern, deren Spalten alle einfach sind, und die höchstens eine Zeile hat. Diese Zeile ist der linke Operand. Ist die gelieferte Tabelle leer, so besteht der Operand aus einer Zeile, deren Spalten alle den Wert NULL haben.


unterabfrage_2

diese Tabelle ist der rechte Operand.


zeile_2

Der rechte Operand ist die Tabelle, dessen einzelne Zeile(n) mit zeile_2 angegeben sind. Ist zeile_2 mehrfach angegeben, so ergibt sich der Datentyp der Spalten der Tabelle aus den Regeln, die unter „Datentyp der Ergebnisspalten bei UNION" beschrieben sind.


zeile_1, zeile_2, unterabfrage_1 und unterabfrage_2 müssen jeweils dieselbe Anzahl Spalten haben, und die korrespondierenden Spalten müssen verträgliche Datentypen haben (siehe Abschnitt „Verträglichkeit von Datentypen").


vektor_spalte

Eine multiple Spalte mit besonderen Regeln für das Ergebnis. Die Spaltenangabe darf keine Außenreferenz sein.


ausdruck

Die Werte müssen einfach sein, und ihre Datentypen müssen mit dem Datentyp der Ausprägungen von vektor_spalte verträglich sein (siehe Abschnitt „Verträglichkeit von Datentypen").


Ergebnis


zeile_1 IN unterabfrage_2 bzw. zeile_1 IN (zeile_2 ,...):

Wahr, wenn der Vergleich von zeile_1 auf Gleichheit mit mindestens einer Zeile des rechten Operanden wahr ergibt.

Falsch, wenn der Vergleich von zeile_1 auf Gleichheit mit jeder Zeile des rechten Operanden falsch ergibt, oder wenn der rechte Operand eine Unterabfrage ist, die eine leere Tabelle liefert.

Unbestimmt, sonst.


zeile_1 NOT IN unterabfrage_2 bzw. zeile_1 NOT IN (zeile_2 ,...):

ist identisch mit:

NOT (zeile_1 IN unterabfrage_2) bzw. NOT (zeile_1 IN ( zeile_2 ,...))

Es gelten die Vergleichsregeln für den Vergleichsoperator „=“ (siehe auch Abschnitt „Vergleichsregeln").


vektor_spalte [NOT] IN (ausdruck, ,...)

Das IN-Prädikat wird für jede Ausprägung von vektor_spalte ausgewertet. Die Einzelergebnisse werden mit OR verknüpft.

Beispiel

Wenn X eine multiple Spalte mit 3 Elementen ist, ist die Elementabfrage X[1..3] IN (13, 20, 30) zu folgenden Elementabfragen äquivalent:

X[1] IN (13, 20, 30) OR X[2] IN (13, 20, 30) OR X[3] IN (13, 20, 30)


Beispiele


IN-Prädikat mit einzelnen Zeilen als rechtem Operanden:

Aus der Tabelle KUNDE alle Kunden mit Kundeninformation heraussuchen, die aus München oder Berlin sind.

SELECT firma, kinfo, ort FROM kunde 
   WHERE ort IN ('Muenchen','Berlin')

   firma            kinfo           ort
   Siemens AG       Elektro         Muenchen
   Login GmbH       PC-Netzwerke    Muenchen
   Plenzer Trading  Fruechtehandel  Muenchen
   Jonas Fischladen Einzelhandel    Berlin


IN-Prädikat mit Unterabfrage als rechtem Operanden:

Aus den Tabellen AUFTRAG und LEISTUNG die Aufträge heraussuchen, bei denen keine Schulung durchgeführt wurde.

SELECT knr FROM auftrag

WHERE anr NOT IN (SELECT anr FROM leistung WHERE ltext = 'Schulung')