Oi, William!! Tudo certo?
Desde já, peço desculpas pela demora em te responder.
Para evitar repetição do código da consulta, você pode utilizar uma variável para armazenar a parte comum do SELECT e concatená-lo com a parte condicional, caso o filtro seja verdadeiro. Observe abaixo um exemplo:
CREATE OR REPLACE FUNCTION consulta(filtro BOOL) RETURNS SETOF tabela1 AS $$
DECLARE
query TEXT := 'SELECT * FROM tabela1';
BEGIN
IF filtro THEN
query := query || ' WHERE col_1 = 25';
END IF;
RETURN QUERY EXECUTE query;
END;
$$ LANGUAGE plpgsql;
- No código acima, iniciamos a criação da função especificando o seu parâmetro (filtro) e indicando que o seu retorno será
tabela1; - Declaramos uma variável chamada
query do tipo TEXT que armazena a parcela da consulta que se repetirá; - Caso
filtro seja TRUE, então incrementamos à variável query o comando contendo a cláusula WHERE. - Depois, retornamos e executamos a
query!
Dessa forma, William, conseguimos remodelar o SELECT, deixando-o com ou sem o filtro (proporcionado pelo WHERE), conforme o parâmetro passado na chamada da função consulta.
Por fim, note que foi retirada o alias do parâmetro da função (a cláusula AS não é necessária para a identificação do tipo de dado) e foi alterada a comparação if filtro = TRUE — como filtro é uma variável do tipo booleano, podemos escrevê-la diretamente, uma vez que ela já será o suficiente para a validação da condição!
William, espero ter ajudado! No entanto, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.
Abraço.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!