Questão de Banco de Dados — PostgreSQL — CESPE / CEBRASPE 2025
- Código
- ce417252
- Banca
- CESPE / CEBRASPE
- Órgão
- TRF 6
- Ano
- 2025
- Cargo
- AJ TRF6
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: Certo. A expressão 'trf minas gerais'::tsvector @@ 'trf'::tsquery retorna t (true) porque o operador @@ verifica se a consulta de texto (tsquery) corresponde ao documento (tsvector), e o termo 'trf' está presente no vetor de texto. O resultado apresentado no enunciado está correto.
A busca em texto completo (full-text search) no PostgreSQL é um recurso que permite pesquisar documentos por palavras ou frases, indo além do simples LIKE. Para isso, o PostgreSQL utiliza dois tipos de dados específicos: tsvector e tsquery.
O tsvector representa um documento já processado, contendo os lexemas (palavras normalizadas) e suas posições no texto. O tsquery representa uma consulta de busca, também processada, que pode conter operadores booleanos como & (E), | (OU) e ! (NÃO). O operador @@ é o coração da busca: ele retorna true se a tsquery encontrar correspondência no tsvector.
No exemplo da questão, 'trf minas gerais'::tsvector cria um vetor com os lexemas 'trf', 'minas' e 'gerais'. A consulta 'trf'::tsquery busca pelo lexema 'trf'. Como 'trf' está presente no vetor, o operador @@ retorna true, que é exibido como t no psql. O resultado t (true) é exatamente o que o enunciado apresenta.
É importante notar que a busca em texto completo é diferente de uma busca por substring. O LIKE '%trf%' encontraria 'trf' em qualquer parte da string, enquanto o tsvector/tsquery trabalha com lexemas normalizados. Por exemplo, a palavra 'TRF' em maiúsculas seria normalizada para 'trf' e encontraria correspondência, mas uma busca por 'tr' não encontraria 'trf' como lexema, pois 'tr' não é uma palavra completa.
A pegadinha que a banca poderia explorar é a confusão entre tsvector e tsquery, ou achar que o operador @@ funciona como um LIKE. Mas aqui, a questão é direta: o termo 'trf' está no vetor, então o resultado é true. Guarde essa distinção: tsvector é o documento, tsquery é a busca, e @@ é o operador de correspondência.
A alternativa está correta. O comando SELECT 'trf minas gerais'::tsvector @@ 'trf'::tsquery as resultado; retorna t (true), pois o operador @@ verifica se a tsquery 'trf' corresponde ao tsvector 'trf minas gerais'. Como o lexema 'trf' está presente no vetor, a condição é verdadeira. O resultado exibido no enunciado (t) é exatamente o que o PostgreSQL retornaria.
Gabarito: Certo
Link permanente: /questoes/ce417252