IN-Operator

Der IN-Operator prüft, ob ein zu vergleichender Ausdruck in einer Menge von Werten vorkommt. Wenn ja, dann wird TRUE zurückgeliefert, wenn nicht, dann FALSE und wenn NULL-Werte in der Vergleichsmenge vorkommen bzw. der zu vergleichende Ausdruck NULL ist, dann wird im Sinne der dreiwertigen Logik UNKNOWN zurückgeliefert. Es gibt zwei verschiedene Syntax. Einmal kann mit einer Liste konstantner Werte verglichen werden, zum anderen mit der Ergebnismenge einer Unterabfrage?. Der IN-Operator kann in beliebigen Suchbedingungen verwendet werden und mit NOT negiert werden.

Damit der Operator syntaktisch ausführbar ist, müssen einige Restriktionen eingehalten werden. Wird eine Liste konstanter Werte verwendet, so darf diese Liste keine Duplikate enthalten und alle Werte müssen vom gleichen Datentyp sein. Zudem muss immer gelten, dass der zu vergleichende Ausdruck und die konstanten Werte bzw. die Spaltenliste der Unteranfrage über die gleiche Struktur verfügen, was heißt, dass die Datentypen gleich sein müssen, die Anzahl der Spalten gleich sein muss und auch die Reihenfolge der Spalten. Die Spalten müssen nicht gleich heißen. Im Grunde gilt hier auch die Anforderung der Vereinigungskonformität.

Für Vergleiche mit einer Unteranfrage ist ein semantisch analoger Operator der EXISTS-Operator. Während bei der Verwendung des unären EXISTS explizit auf die Korrelation geachtet werden muss, ergibt sich beim IN-Operator die Korrelation automatisch aufgrund der Syntax des binären IN. Beim IN werden automatisch Spalten der oberen und der unteren Anfrage in Beziehung gesetzt, weil die oberen Spalten ja den zu vergleichenden Ausdruck darstellen und die unteren Spalten die Spalten der SELECT-Liste sind.

Syntax des Oracle-/SQL-IN-Operators:

   <IN-Operator>  ::=  <Ausdruck> [NOT] IN { (Konstante [,Konstante]...)  |  (<Unterabfrage?>) } 

Beispiele:

  -- Selektieren Sie alle Artikel, für die kein Auftrag vorliegt! 
  SELECT TNr, Bezeichnung
    FROM Artikel 
   WHERE TNr NOT IN (SELECT TNr FROM Auftragspositionen);

  -- Welche Artikel sind von Typ 'Fahrrad', 'Inliner', 'Skateboard'?
  SELECT TNr, Bezeichnung
    FROM Artikel 
   WHERE Artikel_Typ IN ('Fahrrad', 'Inliner', 'Skateboard'); 

 -- Überraschendes Ergebnis
  SELECT TNr, Bezeichnung
    FROM Artikel 
   WHERE Artikel_Typ IN ('Fahrrad', 'Inliner', NULL); 
 -- Diese Abfrage liefert unabhängig von den tatsächlichen Werten in der Spalte Artikel_Typ keinen Wert zurück,
 -- da der Vergleich mit einem NULL-Werte nach der  dreiwertigen Logik dreiwertigen Logik den Wert UNKNOWN ergibt.

(vgl. auch Beispiele des EXISTS-Operators)

Quellen:

  • INCITS/ISO/IEC 9075-1-2008. Part 1 "SQL/Framework", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • INCITS/ISO/IEC 9075-1-2008. Part 2 "SQL/Foundation", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • Elmasri, Ramez/Navathe, Shamkant B.: "Grundlagen von Datenbanksystemen" , Pearson Studium, München, 2002, ISBN 3-8273-7021-3
  • Melton, Jim/Simon, Alan R.: "SQL: 1999 - Understanding Relational Language Components", Morgan Kaufmann, San Francisco, 2001, ISBN 1558604561
  • Oracle® Database SQL Language Reference 11g Release 2 (11.2), E17118-03, August 2010, http://download.oracle.com/docs/cd/E11882_01/server.112/e17118.pdf
  • Saake, Gunter/Sattler, Kai-Uwe/Heuer, Andreas: "Datenbanken - Konzepte und Sprachen", mitp-Verlag, Redline GmbH, Heidelberg, 2007, ISBN 3-8266-1664-2

Kategorie: SQL, I