Pular para o conteúdo principal
Documentos
Sintaxe básicaFunções JSONAcionadoresGerenciamento de tabelas e esquemasFunções de cadeia de caracteresFunções matemáticasFunções de dataBancos de dadosÍndices

PostgreSQL FILTER

A cláusula `FILTER` no PostgreSQL é utilizada para aplicar condições às funções de agregação, permitindo um controle mais granular sobre quais linhas são incluídas na agregação. É particularmente útil para executar a agregação condicional diretamente na chamada da função de agregação.

Uso

A cláusula `FILTER` é utilizada com funções de agregação para especificar uma condição que determina quais linhas serão incluídas no cálculo. Ela é escrita imediatamente após a função de agregação, entre parênteses.

sql
SELECT aggregate_function(column) FILTER (WHERE condition)
FROM table_name;

Nessa sintaxe, `FILTER (WHERE condition)` garante que somente as linhas que atendem à condição especificada sejam consideradas pela função de agregação. As funções de agregação comuns usadas com `FILTER` incluem `SUM`, `COUNT`, `AVG`, `MIN` e `MAX`. Além disso, a cláusula `FILTER` pode ser combinada com funções de janela para consultas analíticas.

Exemplos

1. Uso básico com COUNT

sql
SELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count
FROM users;

Este exemplo conta apenas as tabelas da tabela `users` em que o `status` é 'active'.

2. Usando FILTER com SUM

sql
SELECT SUM(salary) FILTER (WHERE department = 'IT') AS total_it_salary
FROM employees;

Aqui, a função `SUM` calcula o total de salários somente para os funcionários do departamento de "TI".

3. Combinação de vários agregados

sql
SELECT 
    COUNT(*) AS total_orders,
    COUNT(order_id) FILTER (WHERE status = 'completed') AS completed_orders,
    AVG(amount) FILTER (WHERE status = 'completed') AS average_completed_amount
FROM orders;

Este exemplo calcula o número total de pedidos, o número de pedidos concluídos e a quantidade média de pedidos concluídos, tudo em uma única consulta.

Dicas e práticas recomendadas

  • Use para lógica condicional. Use o `FILTER` para aplicar condições diretamente às funções de agregação, simplificando consultas complexas.
  • Melhore a legibilidade. Ao usar o `FILTER`, você pode evitar subconsultas aninhadas e manter uma estrutura de consulta mais limpa.
  • Combinar com GROUP BY. O `FILTER` pode ser efetivamente combinado com o `GROUP BY` para agregações condicionais agrupadas. Por exemplo:
sql
SELECT department, COUNT(employee_id) FILTER (WHERE status = 'active') AS active_employees
FROM employees
GROUP BY department;
  • Condições de teste separadamente. Certifique-se de que a lógica em sua cláusula `FILTER` esteja correta, testando as condições independentemente quando possível.
  • Observe o desempenho em grandes conjuntos de dados. Embora o `FILTER` possa simplificar as consultas, garanta que o desempenho seja ideal, especialmente com grandes conjuntos de dados e condições complexas.
  • Conformidade com o padrão SQL. A cláusula `FILTER` faz parte do padrão SQL, oferecendo benefícios de compatibilidade para consultas entre bancos de dados.

Erros e armadilhas comuns

  • Mal-entendido da lógica de condições: Certifique-se de que a condição na cláusula `FILTER` esteja corretamente especificada para evitar resultados inesperados.
  • Considerações sobre o desempenho: Esteja atento ao possível impacto no desempenho de grandes conjuntos de dados e otimize-os quando necessário.

Comparação entre FILTER e CASE

A cláusula `FILTER` é diferente do uso de instruções `CASE` em funções agregadas. Enquanto o `FILTER` fornece uma sintaxe mais concisa e legível para a agregação condicional, o `CASE` oferece flexibilidade para uma lógica mais complexa. Escolha `FILTER` para condições mais simples e `CASE` quando for necessária uma lógica mais detalhada.