Ternäre Logik

Gemäß dem SQL-Standard ist die ternäre Logik oder die aus drei Werten bestehende Logik (3VL) ein Logiksystem mit drei Wahrheitswerten: TRUE, FALSE und UNKNOWN. In Snowflake wird UNKNOWN durch NULL dargestellt. Die ternäre Logik gilt für die Auswertung boolescher Ausdrücke sowie Prädikate und beeinflusst die Ergebnisse logischer Operationen wie AND, OR und NOT:

  • Bei Verwendung in Ausdrücken (z. B. SELECT-Liste) werden UNKNOWN-Ergebnisse als NULL-Werte zurückgegeben.

  • Bei Verwendung als Prädikat (z. B. WHERE-Klausel) werden UNKNOWN-Ergebnisse als FALSE ausgewertet.

Unter diesem Thema:

Wahrheitstabellen

In diesem Abschnitt werden die Wahrheitstabellen für die Vergleichs- und logischen Operatoren beschrieben.

Vergleichsoperatoren

Wenn für einen Vergleichsoperator ein Operand NULL ist, ist das Ergebnis NULL. Vergleichsoperatoren sind:

= , != , <>

< , <= , > , >=

GREATEST , LEAST

Logische Operatoren

Bei einer BOOLEAN-Spalte C:

Wenn C folgenden Wert hat:

ergibt C AND NULL:

ergibt C OR NULL:

ergibt NOT C:

TRUE

NULL

TRUE

FALSE

FALSE

FALSE

NULL

TRUE

NULL

NULL

NULL

NULL

Darüber hinaus gilt:

Wenn C folgenden Wert hat:

ergibt C AND (NOT C):

ergibt C OR (NOT C):

ergibt NOT (C OR NULL):

TRUE

FALSE

TRUE

FALSE

FALSE

FALSE

TRUE

NULL

NULL

NULL

NULL

NULL

Nutzungshinweise für bedingte Ausdrücke

In diesem Abschnitt wird das Verhalten der folgenden bedingten Ausdrücke beschrieben.

IFF-Verhalten

Die Funktion IFF gibt die folgenden Ergebnisse für die ternäre Logik zurück. Bei einer BOOLEAN-Spalte C:

Wenn C folgenden Wert hat:

ergibt IFF(C, e1, e2):

TRUE

e1

FALSE

e2

NULL

e2

[NOT] IN-Verhalten

Die Funktionen [ NOT ] IN geben die folgenden Ergebnisse für die ternäre Logik zurück. Bei 3 numerischen Spalten c1, c2 und c3:

  • c1 IN (c2, c3, ...) ist syntaktisch äquivalent zu (c1 = c2 or c1 = c3 or ...).

    Wenn der Wert von c1 NULL ist, ergibt der Ausdruck c1 IN (c2, c3, NULL) daher immer FALSE.

  • c1 NOT IN (c2, c3, ... ) ist syntaktisch äquivalent zu (c1 <> c2 AND c1 <> c3 AND ...).

    Selbst wenn c1 NOT IN (c2, c3) TRUE ist, ergibt c1 NOT IN (c2, c3, NULL) NULL.