Logique ternaire

Comme spécifié dans la norme SQL, la logique ternaire, ou logique à trois valeurs (3VL), est un système logique avec trois valeurs de vérité : TRUE, FALSE, et UNKNOWN. Dans Snowflake, UNKNOWN est représenté par NULL. La logique ternaire s’applique à l’évaluation des expressions booléennes, ainsi que des prédicats, et affecte les résultats des opérations logiques telles que AND, OR et NOT :

  • En cas d’utilisation dans des expressions (par exemple, dans une liste SELECT), les résultats de UNKNOWN sont renvoyés sous forme de valeurs NULL.

  • En cas d’utilisation comme prédicat (par exemple, dans une clause WHERE), les résultats de UNKNOWN sont évalués sur FALSE.

Dans ce chapitre :

Tables de vérité

Cette section décrit les tables de vérité pour les opérateurs de comparaison et logiques..

Opérateurs de comparaison

Si un opérande pour un opérateur de comparaison est NULL, le résultat est NULL. Les opérateurs et fonctions de comparaison sont les suivants :

Opérateurs logiques

Avec une colonne BOOLEAN C :

Si C est :

C AND NULL s’évalue sur :

C OR NULL s’évalue sur :

NOT C s’évalue sur :

TRUE

NULL

TRUE

FALSE

FALSE

FALSE

NULL

TRUE

NULL

NULL

NULL

NULL

Par ailleurs :

Si C est :

C AND (NOT C) s’évalue sur :

C OR (NOT C) s’évalue sur :

NOT (C OR NULL) s’évalue sur :

TRUE

FALSE

TRUE

FALSE

FALSE

FALSE

TRUE

NULL

NULL

NULL

NULL

NULL

Notes sur l’utilisation des expressions conditionnelles

Cette section décrit le comportement propre aux expressions conditionnelles.

Comportement IFF

IFF renvoie les résultats suivants pour la logique ternaire. Avec une colonne BOOLEAN C :

Si C est :

IFF(C, e1, e2) s’évalue sur :

TRUE

e1

FALSE

e2

NULL

e2

Comportement [NOT] IN

[ NOT ] IN renvoie les résultats suivants pour la logique ternaire. Avec 3 colonnes numériques c1, c2 et c3 :

  • c1 IN (c2, c3, ...) est syntaxiquement équivalent à (c1 = c2 OR c1 = c3 OR ...).

    Par conséquent, lorsque la valeur de c1 est NULL, l’expression c1 IN (c2, c3, NULL) s’évalue toujours sur NULL.

  • c1 NOT IN (c2, c3, ... ) est syntaxiquement équivalent à (c1 <> c2 AND c1 <> c3 AND ...).

    Par conséquent, même si c1 NOT IN (c2, c3) est TRUE, c1 NOT IN (c2, c3, NULL) s’évalue sur NULL.