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.

Neste tópico:

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.