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 booleanas, bem como de predicados, e afeta os resultados de operações lógicas como AND, OR e NOT:

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

  • Quando usada como um predicado (por exemplo, cláusula WHERE), resultados 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 de comparação são:

= , != , <>

< , <= , > , >=

GREATEST , LEAST

Operadores de lógica

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 seguintes expressões condicionais.

Comportamento IFF

A função 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

As funções [ NOT ] IN retornam 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 FALSE.

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