Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Vergleichsregeln

Wie eine Vergleichsoperation ausgeführt wird, hängt von ihren Operanden ab. Lexikografische Vergleichsregeln gelten für den Vergleich von Zeilen mit mehr als einer Spalte; beim Vergleich von einspaltigen Zeilen und von Werten richten sich die Vergleichsregeln nach den Datentypen. Diese Vergleichsregeln sind im Folgenden zusammengestellt.

Lexikografischer Vergleich

Das Vergleichsresultat wird aus dem Vergleich der Werte in korrespondierenden Spalten beider Zeilen abgeleitet. Dabei spielen die Werte von weiter rechts stehenden Spalten nur dann eine Rolle, wenn die Werte in allen vorhergehenden Spalten bei beiden Operanden gleich sind (nach diesen Vergleichsregeln wird auch im Lexikon sortiert.)

Formal ausgedrückt heißt das:
Der Vergleich zweier Zeilen mit dem Vergleichsoperator OP (der die Werte „<“ oder „>“ hat), den Spaltenwerten L1,L2,...,Ln im linken Operanden und den Spaltenwerten R1,R2,...,Rn im rechten Operanden liefert den Wahrheitswert wahr bzw. falsch bzw. unbestimmt, wenn es einen Index i zwischen 1 und n gibt, so dass alle Vergleiche

L1    =   R1
L2    =   R2
 .    .    .
 .    .    . 
 .    .    .
L(i-1) = R(i-1)

als Ergebnis den Wahrheitswert wahr liefern, und der Vergleich

Li OP Ri

als Ergebnis den Wahrheitswert wahr bzw. falsch bzw. unbestimmt liefert.

Dabei erfolgen die einzelnen Vergleiche je nach Datentyp wie unten beschrieben.

Beachten Sie bitte Folgendes:

  • Der Wert in einer Spalte kann durchaus NULL sein, ohne dass als Ergebnis der Wahrheitswert unbestimmt geliefert wird.

    Zum Beispiel ergibt der Vergleich (1,CAST(NULL AS INT)) < (2,0) den Wahrheitswert wahr als Ergebnis. Die zweite Spalte wird beim Vergleich ignoriert, weil sich schon die Werte der ersten Spalten unterscheiden.

  • Nicht alle Spalten müssen für das Vergleichsergebnis relevant sein. Man darf sich daher nicht darauf verlassen, dass alle Spalten beider Zeilen immer ausgewertet werden.

  • Der Vergleich (L1, L2, ..., Ln) = (R1, R2, ..., Rn) ist äquivalent ist zum Vergleich L1 = R1 AND L2 = R2 ... AND Ln = Rn.

    Bei den Vergleichsoperatoren „<“, „<=“, „>=“, und „>“ gibt es aber keine so einfache Entsprechung.

Vergleich zweier Werte

Ist ein Operand der NULL-Wert, oder sind es beide, so liefern alle Vergleichsoperatoren als Ergebnis den Wahrheitswert unbestimmt (siehe auch Abschnitt „NULL-Wert").

Alphanumerische Werte

Zwei alphanumerische Werte werden von links nach rechts Zeichen für Zeichen verglichen. Sind die beiden Werte unterschiedlich lang, wird die kürzere Zeichenkette rechts mit Leerzeichen (X'40') aufgefüllt, sodass beide gleich lang sind.

Zwei Zeichenketten sind gleich, wenn sie an jeder Position das gleiche Zeichen haben.

Wenn zwei Zeichenketten nicht gleich sind, bestimmt der EBCDIC-Code der ersten beiden unterschiedlichen Zeichen, welche Zeichenkette größer bzw. kleiner ist.

National-Werte

Zwei National-Werte werden von links nach rechts Code Unit für Code Unit verglichen. Sind die beiden Werte unterschiedlich lang, wird die kürzere Zeichenkette rechts mit Leerzeichen (NX'0020') aufgefüllt, sodass beide gleich lang sind.

Zwei Zeichenketten sind gleich, wenn sie an jeder Position die gleiche Code Unit haben.

Wenn zwei Zeichenketten nicht gleich sind, bestimmt der binäre Wert der ersten beiden unterschiedlichen UTF-16 Code Units, welche Zeichenkette größer bzw. kleiner ist.

Numerische Werte

Werte von numerischen Datentypen werden nach ihrem arithmetischen Wert verglichen. Zwei numerische Werte sind gleich, wenn sie beide 0 sind oder dasselbe Vorzeichen und denselben Betrag haben.

Zeitwerte

Datum, Zeit und Zeitstempel können verglichen werden. Der Datentyp der beiden Operanden muss identisch sein.

  • Ein Datum ist größer als ein anderes, wenn es jünger ist.

  • Eine Uhrzeit ist größer als eine andere, wenn sie eine spätere Zeit angibt.

  • Ein Zeitstempel ist größer als ein anderer, wenn entweder das Datum jünger ist oder, bei gleichem Datum, die Uhrzeit größer ist.


Beispiele

  1. 1 <= 1 ist stets wahr.

  2. Alphanumerische Werte vergleichen:
    Aus der Tabelle KUNDE die Kunden mit Kundeninformation heraussuchen, die aus München kommen:

    SELECT firma, kinfo, ort FROM kunde WHERE ort = 'Muenchen'
       firma               kinfo                 ort
       Siemens AG        Elektro             Muenchen
       Login GmbH        PC Netzwerke        Muenchen
       Plenzer Trading   Fruechtehandel      Muenchen
    
  3. Vergleich mit Unterabfrage, die genau einen Wert liefert:
    Aus der Tabelle VERWENDUNG den Artikel heraussuchen, für den die größte Menge des Bestandteils 501 benötigt wird.

    SELECT artnr FROM verwendung 
       WHERE bestandteil = 501 AND anzahl = (SELECT MAX(anzahl) 
       FROM verwendung WHERE bestandteil = 501)
    

    Die Unterabfrage liefert genau eine Zeile, da das Maximum für eine einzige Gruppe bestimmt wird.

    artnr

    200

    Das Beispiel kann man auch mit dem Vergleich zweier Zeilen mit je zwei Spalten schreiben:

    SELECT artnr FROM verwendung 
       WHERE (bestandteil, anzahl) = (SELECT 501, MAX(anzahl) 
       FROM verwendung WHERE bestandteil = 501)
    
  4. In diesem Beispiel wird eine Cursortabelle mit ORDER BY definiert.
    Mit der WHERE-Klausel werden diejenigen Zeilen ausgewählt, die in der mit ORDER BY festgelegten Reihenfolge hinter den Zeilen mit knr 012 und
    fertigsoll DATE'<date>' kommen:

    DECLARE cur_auftrag CURSOR FOR
                        SELECT anr, knr, atext, fertigsoll FROM auftrag
                        WHERE (knr, fertigsoll) > (012, DATE'<date>')
       ORDER BY knr, fertigsoll
    

    Man erhält vom Kunden mit der Kunden-Nummer 012 nur die Aufträge, die nach dem angegebenen Datum fertig sein sollen, und von Kunden mit größerer Kunden-Nummer alle Aufträge.

    Die lexikografischen Vergleichsregeln unterscheiden sich nur bei NULL-Werten von den Vergleichsregeln für ORDER BY.

  5. Lexikografischer Vergleich von Zeilen

    DECLARE rest_verwendung CURSOR FOR
       SELECT artnr, bestandteil, SUM(anzahl) 
       FROM verwendung
       WHERE (artnr, bestandteil) > (:letzte_artnr, :letzter_bestandteil)
       GROUP BY artnr, bestandteil 
       HAVING SUM(anzahl) > 0
       ORDER BY artnr, bestandteil
    

    Mit diesem Cursor wird gelesen, wieviele Exemplare von jedem Bestandteil in den verschiedenen Artikeln enthalten sind. Gelesen wird in der Reihenfolge aufsteigender Artikelnummern, und, bei gleichen Artikelnummern, nach aufsteigenden Nummern der Bestandteile.

    Mit der Klausel WHERE läßt sich die Cursortabelle stückweise lesen (FETCH). Wurde z.B. schon bis zum Artikel 120 und Bestandteil 230 gelesen und wird der Cursor erneut mit den Benutzervariablen :letzte_artnr = 120 und :letzter_bestandteil = 230 geöffnet, so enthält die Cursortabelle für Artikel 120 nur noch Angaben zu den Bestandteilen mit Nummern > 230 sowie Angaben zu Artikeln mit Nummern > 120 (und beliebigen Bestandteilen).