IFNULL, COALESCE 활용 문제

HONG LEE ·2024년 6월 26일
0

https://leetcode.com/problems/average-selling-price/

위와 같은 SQL 문제를 풀어보았다.
나는 아래와 같은 코드를 통해 풀었다.

코드를 입력하세요
with cte as (
SELECT 
    p.product_id,
    p.start_date,
    p.end_date,
    p.price,
    s.product_id AS units_product_id,
    s.purchase_date,
    COALESCE(s.units, 0) AS units
FROM 
    Prices p 
LEFT JOIN 
    UnitsSold s 
ON 
    p.product_id = s.product_id 
    AND s.purchase_date BETWEEN p.start_date AND p.end_date
), 
cte2 as (
select product_id,
       round(sum(price * units) / sum(units), 2) as average_price
from cte
group by 1
)
select product_id, 
       coalesce(average_price, 0) as average_price
from cte2

이 문제를 풀며 새로 알게된 사실들이 있다.

  1. WITH문의 SELECT절을 쓸 때 같은 이름이 있다면 다른 이름으로 바꾸어주자!
  1. COALESCE 함수는 SELECT, WHERE절에서 쓰인다.
    처음에는 JOIN문에다가 썼었는데 작동되지 않았다.

COALESCE 문법은 COALESCE(A,N) 인데, A컬럼에서 NULL이 아닌 것은 A값 그대로 가져오고, NULL인 값은 N으로 치환한다. COALESCE(A,B,C,N) 이라면 A가 NULL 값이면 B를 가지고 오고, 이때 B또한 NULL이면 C값을 가지고 오고, 만약 C도 NULL이라면 N을 가져오는 식이다.

아래처럼 풀이한 다른 사람도 있었다.

코드를 입력하세요
SELECT p.product_id, IFNULL(ROUND(SUM(units*price)/SUM(units),2),0) AS average_price
FROM Prices p LEFT JOIN UnitsSold u
ON p.product_id = u.product_id AND
u.purchase_date BETWEEN start_date AND end_date
group by product_id

IFNULL이라는 함수를 사용했는데 IF랑 똑같은 문법을 가지고 있었다.

IFNULL(A,B) : A가 NULL이 아니면 그대로 표현해주고, NULL이라면 B값으로 대체

IFNULL과 COALESCE 의 가장 큰 차이점이 있다면 IFNULL은 인자를 2개밖에 가져올 수 없지만 COALESCE는 여러가지의 인자를 가져올 수 있다는 차이가 있다.

0개의 댓글