Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165271
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )
No contexto da lógica de três estados, normalmente usada em expressões logicas que envolvem valores nulos, considere uma tabela relacional exemplo com colunas A, B, C, com apenas uma linha, cujos valores das colunas são, respectivamente, 10, 20 e null, além do comando SQL a seguir.
select
case when (not C is null or B = 15)
then 1 else 0 end x1,
case when not (not C is null or B = 15)
then 1 else 0 end y1,
case when (C = null or B <> null)
then 1 else 0 end x2,
case when not (C = null or B <> null)
then 1 else 0 end y2,
case when (C < A or C > A)
then 1 else 0 end x3,
case when not (C < A or C > A)
then 1 else 0 end y3
from exemplo
Assinale os valores do resultado da execução do comando acima, na ordem da colunas x1, y1, x2, y2, x3, y3.
A0, 0, 0, 0, 0, 1
B0, 1, 0, 0, 0, 0
C0, 1, 0, 1, 0, 1
D0, 1, 1, 0, 1, 0
E0, 1, 1, 1, 0, 0
Revelar gabarito e comentário▾
GabaritoB — 0, 1, 0, 0, 0, 0
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Resolução
Gabarito: letra B — a conta chega a 0, 1, 0, 0, 0, 0 — alternativa B.
A ideia por trás
No SQL, um valor nulo (NULL) não é um número nem um texto: é a ausência de valor. Por isso, qualquer comparação direta com NULL — como C = NULL, B <> NULL, C < A — não pode ser verdadeira nem falsa; ela resulta em um terceiro estado chamado UNKNOWN. Esse estado é o coração da lógica de três estados, que o SQL usa para lidar com o desconhecido.
As regras são: (1) comparações com NULL sempre dão UNKNOWN; (2) os únicos testes que dão TRUE ou FALSE são IS NULL e IS NOT NULL; (3) na tabela verdade, TRUE OR UNKNOWN = TRUE, FALSE OR UNKNOWN = UNKNOWN, NOT UNKNOWN = UNKNOWN; (4) em um CASE, uma condição UNKNOWN é tratada como FALSE, então o ELSE é executado. Essas regras valem para qualquer expressão que envolva NULL.
Esta questão testa exatamente essas regras: cada expressão CASE mistura comparações com NULL e operadores lógicos, e você precisa decidir se o resultado é TRUE, FALSE ou UNKNOWN — lembrando que UNKNOWN vira 0 no CASE.
O que a questão dá
A = 10
B = 20
C = NULL
comando SQL com seis expressões CASE
O que queremos: os valores retornados nas colunas x1, y1, x2, y2, x3, y3
Passo 1 — Avaliar a condição de x1
Começamos pela primeira expressão. Precisamos saber se (not C is null or B = 15) é TRUE ou FALSE. Como C é NULL, C is null é TRUE, então not C is null é FALSE. B = 15 é FALSE porque B é 20. FALSE OR FALSE = FALSE, então o CASE retorna 0.
Por que esta fórmula: Usamos a tabela verdade do OR: só é TRUE se pelo menos um lado for TRUE. Aqui os dois lados são FALSE.
NÃO CAIA NESSA!
Achar que not C is null é TRUE, esquecendo que C is null é TRUE e a negação inverte.
Passo 2 — Avaliar a condição de y1
y1 é a negação da expressão de x1. Como já sabemos que a expressão interna é FALSE, NOT FALSE = TRUE, então o CASE retorna 1.
Por que esta fórmula: A negação de FALSE é TRUE.
NÃO CAIA NESSA!
Confundir a negação de uma expressão com a negação de cada termo.
Passo 3 — Avaliar a condição de x2
Agora temos comparações diretas com NULL: C = null e B <> null. Ambas resultam em UNKNOWN, porque comparar qualquer coisa com NULL nunca é TRUE nem FALSE. UNKNOWN OR UNKNOWN = UNKNOWN, e no CASE isso vira 0.
Por que esta fórmula: A regra é: qualquer comparação com NULL dá UNKNOWN. E UNKNOWN OR UNKNOWN = UNKNOWN.
NÃO CAIA NESSA!
Achar que C = null é FALSE e B <> null é TRUE — ambos são UNKNOWN.
Passo 4 — Avaliar a condição de y2
y2 é a negação da expressão de x2. Como a interna é UNKNOWN, NOT UNKNOWN = UNKNOWN, e no CASE isso vira 0.
Por que esta fórmula: A negação de UNKNOWN continua UNKNOWN.
NÃO CAIA NESSA!
Achar que NOT UNKNOWN vira TRUE — não vira.
Passo 5 — Avaliar a condição de x3
Aqui temos C < A e C > A. Como C é NULL, ambas as comparações dão UNKNOWN. UNKNOWN OR UNKNOWN = UNKNOWN, então o CASE retorna 0.
Por que esta fórmula: Comparações com NULL sempre dão UNKNOWN, independentemente do outro valor.
NÃO CAIA NESSA!
Achar que C < A é TRUE porque NULL é menor que 10 — não é.
Passo 6 — Avaliar a condição de y3
y3 é a negação da expressão de x3. Como a interna é UNKNOWN, NOT UNKNOWN = UNKNOWN, e no CASE isso vira 0.
Por que esta fórmula: A negação de UNKNOWN continua UNKNOWN.