Questão de Banco de Dados — PostgreSQL — FUNDATEC 2023
Banco de Dados›PostgreSQL
Código
qq896931
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2023
Nível
Superior
Cargo
ANC - Analista em Computação - Ênfase em Suporte de Banco de Dados
Considerando o sistema de banco de dados relacional PostgreSQL versão 14, em um banco de dados, existe uma tabela Funcionario. A tabela Funcionario tem quatro colunas:• id, uma chave serial • nome, do tipo string • endereco, do tipo string • contato, do tipo JSONB O objeto JSON contato tem um campo chamado email. Qual das seguintes queries retornariam todos os funcionários cujo endereço de email termine em @exemplo.com?
ASELECT * FROM Funcionario WHERE contato->>'email' LIKE '%@exemplo.com';
BSELECT * FROM Funcionario WHERE contato->'email' LIKE '%@exemplo.com';
CSELECT * FROM Funcionario WHERE contato->>'email' = '*@exemplo.com';
DSELECT * FROM Funcionario WHERE contato->'email' = '%@exemplo.com';
ESELECT * FROM Funcionario WHERE contato->'email' = '*@exemplo.com';
Revelar gabarito e comentário▾
GabaritoA — SELECT * FROM Funcionario WHERE contato->>'email' LIKE '%@exemplo.com';
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”.
PostgreSQL: Consulta em coluna JSONB
Gabarito: letra A. A query correta usa o operador ->> para extrair o campo email como texto e a cláusula LIKE com o padrão '%@exemplo.com' para filtrar endereços que terminam com @exemplo.com.
A tabela Funcionario possui uma coluna contato do tipo JSONB, que armazena um objeto JSON com um campo email. No PostgreSQL, o operador ->> acessa um campo JSON e retorna o valor como texto (TEXT), enquanto o operador -> retorna o valor como JSON (ou NULL). Para usar operadores de string como LIKE, é necessário que o valor seja do tipo texto, portanto ->> é o operador adequado.
O padrão '%@exemplo.com' utiliza o curinga % do LIKE, que corresponde a qualquer sequência de caracteres, garantindo que emails terminados em @exemplo.com sejam selecionados.
SELECT * FROM Funcionario WHERE contato->>'email' LIKE '%@exemplo.com';
Correta: ->> extrai o email como texto, e LIKE com % realiza a correspondência de padrão corretamente.
Alternativa B — ❌ Incorreta
SELECT * FROM Funcionario WHERE contato->'email' LIKE '%@exemplo.com';
Erro: usa -> em vez de ->>. O operador -> retorna o valor como JSON (objeto ou string JSON), não como texto, e o LIKE não se aplica a tipos JSON. A consulta pode gerar erro de tipo ou retornar vazio.
Alternativa C — ❌ Incorreta
SELECT * FROM Funcionario WHERE contato->>'email' = '*@exemplo.com';
Erro: usa = em vez de LIKE e o curinga * em vez de %. O operador = exige correspondência exata; * não é curinga no PostgreSQL (o curinga é %). Assim, somente funcionários com email literal *@exemplo.com seriam retornados.
Alternativa D — ❌ Incorreta
SELECT * FROM Funcionario WHERE contato->'email' = '%@exemplo.com';
Erro: combina dois erros: (1) -> em vez de ->> e (2) = em vez de LIKE. A consulta tentaria comparar um valor JSON com a string '%@exemplo.com', o que não corresponde à intenção.
Alternativa E — ❌ Incorreta
SELECT * FROM Funcionario WHERE contato->'email' = '*@exemplo.com';
Erro: mesmo erro de operador (->) e uso de = com curinga incorreto (*). Não produz o resultado esperado.
NÃO CAIA NESSA!
A banca troca o operador ->> (que retorna texto) por -> (que retorna JSON) nas alternativas B, D e E. Além disso, confunde LIKE com = e o curinga % com *. Lembre-se: para acessar campos JSONB como texto, use ->>; para fazer busca por padrão, use LIKE e %.