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!