NULL 정렬

NULL의 위치를 맡기면 DBMS마다 결과 순서가 달라질 수 있다

ORDER BY bonus DESC만 쓰면 NULL을 큰 값처럼 볼지 작은 값처럼 볼지에 대한 의도가 드러나지 않습니다. 정렬 기준에 결측값이 들어가면 위치를 직접 적는 쪽이 안전합니다.

위치 지도

NULL을 값의 끝으로 보낼지, 시작으로 보낼지 직접 고정한다

입력 데이터

보너스 값에 NULL이 섞여 있다

namebonus
도윤 30
서연 NULL
민준 10
지우 NULL
ORDER BY bonus DESC

숫자는 내림차순이 분명하지만, NULL의 위치는 이 코드만으로는 불명확합니다.

암묵적 정렬

DBMS 기본값에 따라 NULL이 앞에 올 수 있다

1서연NULL
2지우NULL
3도윤30
4민준10

쿼리는 같아도 “미정 값”을 정렬 최상단에 놓는 엔진에서는 결과 페이지가 바뀝니다.

명시적 정렬

NULLS LAST를 쓰면 보너스 있는 행이 먼저 온다

1도윤30
2민준10
3서연NULL
4지우NULL
ORDER BY bonus DESC NULLS LAST
이식성

문법 지원이 다르면 CASE로 NULL 우선순위를 만든다

NULL을 뒤로 보내려면 먼저 NULL 여부를 0과 1로 정렬하고, 그 다음 실제 값을 내림차순으로 정렬합니다.

ORDER BY
  CASE WHEN bonus IS NULL THEN 1 ELSE 0 END,
  bonus DESC
점검 1

정렬 컬럼이 NULL 가능한가

nullable 컬럼이면 페이지 순서, TOP-N, 랭킹 결과가 DBMS마다 달라질 수 있습니다.

점검 2

NULL을 앞에 둘지 뒤에 둘지 정한다

비즈니스 의미가 “값 없음”인지 “최소값”인지에 따라 의도를 먼저 고정합니다.

점검 3

지원 문법을 확인한다

지원하지 않는 엔진까지 고려해야 하면 CASE 방식으로 같은 순서를 재현합니다.