반응형

◆ FILTER 절이란?


PostgreSQL의 FILTER 절은 집계함수(aggregate function)에 조건을 적용하여 특정 조건에 맞는 데이터만 집계할 수 있도록 하는 기능이다.

 

 

◆ FILTER 절의 기본 사용법


FILTER절은 SQL 표준에 따라 PostgreSQL이 지원하는 문법으로, 집계함수 뒤에 FILTER 키워드를 사용하여 적용하며, 이 경우 반드시 WHERE 조건을 포함해야 한다.

MySQL, Oracle 등 다른 DBMS에서는 지원되지 않기 때문에, CASE문을 활용해 동일 기능을 구현해야 한다.

문법: 집계함수(...) FILTER (WHERE 조건)
-- 총 주문수와 완료된 주문수 집계
SELECT
    COUNT(*) AS 총주문수
  , COUNT(*) FILTER (WHERE order_status = 'completed') AS 완료된주문수
FROM orders;

 

 

◆ 예제


PostgreSQL FILTER 절의 집계함수와 동일한 처리를 다른 DBMS(MySQL, Oracle)에서 어떻게 구현하는지 비교한 예제이니 참고하자.

-- PostgreSQL FILTER WHERE
SELECT
    category AS 카테고리
  , COUNT(*) AS 전체상품수
  , COUNT(*) FILTER (WHERE stock > 0) AS 재고있는상품수
  , SUM(price) FILTER (WHERE stock > 0) AS 재고있는상품의총가격
  , AVG(price) FILTER (WHERE stock > 0) AS 재고있는상품의평균가격
  , MAX(price) FILTER (WHERE stock > 0) AS 재고있는상품의최고가격
  , MIN(price) FILTER (WHERE stock > 0) AS 재고있는상품의최저가격
FROM products
GROUP BY category
ORDER BY 전체상품수 DESC;

 

-- MySQL, Oracle CASE문
SELECT
    category AS 카테고리
  , COUNT(*) AS 전체상품수
  , SUM(CASE WHEN stock > 0 THEN 1 ELSE 0 END) AS 재고있는상품수
  , SUM(CASE WHEN stock > 0 THEN price ELSE 0 END) AS 재고있는상품의총가격
  , AVG(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의평균가격
  , MAX(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의최고가격
  , MIN(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의최저가격
FROM products
GROUP BY category
ORDER BY 전체상품수 DESC;

 

참조
Aggregate Expressions
https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES

 


글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --
반응형