Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Retornar Querys diferentes com base em argumento

Gostaria de executar em filtro em uma consulta apenas se o argumento da função for TRUE Exemplo:

CREATE FUNCTION consulta(filtro AS BOOL) $$

                IF filtro = TRUE THEN
                               RETURN QUERY
                               SELECT * FROM tabela1
                               WHERE col_1 = 25

                ELSE
                               RETURN QUERY
                               SELECT * FROM tabela1
                END IF

$$ LANGUAGE plpgsql;

Porém não quero repetir o código da query pois ela pode ser mais complexa

Alguém poderia me ajudar a escrever uma única QUERY que leve em consideração essa parâmetro?

2 respostas
solução!

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!

Obrigado! Isso já me ajuda muito