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')