Lógica ternária

Como especificado no padrão SQL, lógica ternária, ou lógica de três valores (3VL), é um sistema lógico com três valores de verdade: TRUE, FALSE e UNKNOWN. No Snowflake, UNKNOWN é representado por NULL. A lógica ternária se aplica à avaliação de expressões boolianas, bem como de predicados, e afeta os resultados de operações lógicas como AND, OR e NOT:

  • Quando usado em expressões (por exemplo, em uma lista SELECT), os resultados UNKNOWN são retornados como valores NULL.

  • Quando usado como um predicado (por exemplo, em uma cláusula WHERE), os resultados de UNKNOWN são avaliados como FALSE.

Tabelas de verdades

Esta seção descreve as tabelas de verdades para os operadores de comparação e lógica.

Operadores de comparação

Se qualquer operando para um operador de comparação é NULL, o resultado é NULL. Os operadores e as funções de comparação são:

Operadores lógicos

Dada uma coluna BOOLEAN C:

Se C for:

C AND NULL avalia como:

C OR NULL avalia como:

NOT C avalia como:

TRUE

NULL

TRUE

FALSE

FALSE

FALSE

NULL

TRUE

NULL

NULL

NULL

NULL

Além disso:

Se C for:

C AND (NOT C) avalia como:

C OR (NOT C) avalia como:

NOT (C OR NULL) avalia como:

TRUE

FALSE

TRUE

FALSE

FALSE

FALSE

TRUE

NULL

NULL

NULL

NULL

NULL

Notas de uso para expressões condicionais

Esta seção descreve o comportamento específico das expressões condicionais.

Comportamento de IFF

IFF retorna os seguintes resultados para a lógica ternária. Dada uma coluna BOOLEAN C:

Se C for:

IFF(C, e1, e2) avalia como:

TRUE

e1

FALSE

e2

NULL

e2

Comportamento [ NOT ] IN

[ NOT ] IN retorna os seguintes resultados para a lógica ternária. Dadas as 3 colunas numéricas c1, c2 e c3:

  • c1 IN (c2, c3, ...) é sintaticamente equivalente a (c1 = c2 OR c1 = c3 OR ...).

    Como resultado, quando o valor c1 é NULL, a expressão c1 IN (c2, c3, NULL) sempre avalia como NULL.

  • c1 NOT IN (c2, c3, ... ) é sintaticamente equivalente a (c1 <> c2 AND c1 <> c3 AND ...).

    Portanto, mesmo se c1 NOT IN (c2, c3) for TRUE, c1 NOT IN (c2, c3, NULL) avalia como NULL.