본문 바로가기
개발/기타

nullable한 값을 반환하는 집계함수

by hamcheeseburger 2022. 10. 14.

학습 주제

  • Mysql 집계함수 중 null을 반환하는 것들

학습 동기

  • 팀원들이랑 페어 프로그래밍 중, AVG 키워드가 null을 반환하여 primitive 타입에 바인딩이 되지 않는 문제가 발생했다.

학습 내용

MySql 집계함수

COUNT

  • 데이터 행의 개수를 추출하는 키워드
  • NULL 이 반환되지 않음
public class Keyboard {
		// ...
    @Formula("(SELECT COUNT(1) FROM review r WHERE r.product_id = id)")
    private int reviewCount;
}
@Test
void COUNT_키워드는_NULL을_반환하지_않는다() {
    // given
    Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
    entityManager.flush();
    entityManager.refresh(keyboard);

    // when
    final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
            .orElseThrow(IllegalArgumentException::new);

    // then
    assertThat(savedKeyboard.getReviewCount()).isEqualTo(0);
}

AVG

  • 데이터 특정 값들의 평균을 추출하는 키워드
  • NULL이 반환될 수 있음
public class Keyboard {
		// ...

    @Formula("(SELECT AVG(r.rating) FROM review r WHERE r.product_id = id)")
    private Double rating;
}
@Test
void AVG_키워드는_NULL을_반환한다() {
    // given
    Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
    entityManager.flush();
    entityManager.refresh(keyboard);

    // when
    final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
            .orElseThrow(IllegalArgumentException::new);

    // then
    assertThat(savedKeyboard.getRating()).isEqualTo(null);
}

MIN

  • 데이터 특정 값들의 최소값을 추출하는 키워드
  • NULL 이 반환될 수 있음
public class Keyboard {
		// ..
    @Formula("(SELECT MIN(r.rating) FROM review r WHERE r.product_id = id)")
    private Integer minimumRating;
}
@Test
void MIN_키워드는_NULL을_반환한다() {
    // given
    Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
    entityManager.flush();
    entityManager.refresh(keyboard);

    // when
    final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
            .orElseThrow(IllegalArgumentException::new);

    // then
    assertThat(savedKeyboard.getMinimumRating()).isEqualTo(null);
}

MAX

  • 데이터 특정 값들의 최대값을 추출하는 키워드
  • NULL 이 반환될 수 있음
public class Keyboard {
		// ..
    @Formula("(SELECT MAX(r.rating) FROM review r WHERE r.product_id = id)")
    private Integer maximumRating;
}
@Test
void MAX_키워드는_NULL을_반환한다() {
    // given
    Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
    entityManager.flush();
    entityManager.refresh(keyboard);

    // when
    final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
            .orElseThrow(IllegalArgumentException::new);

    // then
    assertThat(savedKeyboard.getMaximumRating()).isEqualTo(null);
}

SUM

  • 데이터 특정 값들의 합을 추출하는 키워드
  • NULL 이 반환될 수 있음
public class Keyboard {
		// ..
    @Formula("(SELECT SUM(r.rating) FROM review r WHERE r.product_id = id)")
    private Integer sumRating;
}
@Test
void SUM_키워드는_NULL을_반환한다() {
    // given
    Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
    entityManager.flush();
    entityManager.refresh(keyboard);

    // when
    final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
            .orElseThrow(IllegalArgumentException::new);

    // then
    assertThat(savedKeyboard.getSumRating()).isEqualTo(null);
}

결론

  • COUNT 를 제외한 집계함수들은 NULL 이 반환될 수 있다.
  • NULL 이 반환될 수 있는 집계함수에서 primitive로 받고 싶다면 IFNULL 키워드를 사용할 수 있다.

이전 댓글