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. in einer SELECT-Liste) werden UNKNOWN-Ergebnisse als NULL-Werte zurückgegeben.

  • Bei Verwendung als Prädikat (z. B. in einer WHERE-Klausel) werden UNKNOWN-Ergebnisse zu 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. Die Vergleichsoperatoren und -funktionen sind:

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

Dieser Abschnitt beschreibt die spezifische Verhaltensweise von bedingten Ausdrücken.

IFF-Verhalten

IFF liefert die folgenden Ergebnisse für ternäre Logik. Bei einer BOOLEAN-Spalte C:

Wenn C folgenden Wert hat:

ergibt IFF(C, e1, e2):

TRUE

e1

FALSE

e2

NULL

e2

[NOT] IN-Verhalten

[ NOT ] IN liefert die folgenden Ergebnisse für ternäre Logik. 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 NULL.

  • 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.