강좌와 팁

SQL-NULL값의 순서 조정 날짜:2020-2-28 2:38:29 조회수:109
작성자 : 소엔
포인트 : 1368
가입일 : 2020-02-02 00:09:14
방문횟수 : 72
글 186개, 댓글 51개
소개 : SoEn 운영자입니다.
작성글 보기
쪽지 보내기
NULL은 특정한 값이 아니라 알수 없음, 결정되지 않음을 나타내는 특수한 상태입니다. 값이 아니다 보니 NULL이 진짜 값에 비해 큰지 작은지도 결정할 수 없으며 표준에도 딱히 정해진 규정이 없습니다. 워낙 특수한 값이다 보니 크기를 어떻게 정의하든 문제되지 않지만 정렬할 때는 심미적인 문제가 발생하는데 다음 쿼리문을 보죠.
 
SELECT * FROM tStaff ORDER BY score;
 
직원 테이블을 성취도에 따라 정렬하는 쿼리문이되 score가 NULL인 행이 두 개 있습니다. 이 필드가 어디에 출력되는지 DBMS별로 살펴 보면 다음과 같습니다.



SQL 서버는 NULL을 가장 작은 값으로 평가하여 제일 먼저 출력합니다. 반면 오라클은 NULL
을 가장 큰 값으로 평가하여 마지막에 출력합니다.



MySQL, MariaDB는 SQL 서버와 마찬가지로 NULL을 가장 작은 값으로 취급합니다. 어떤게 맞다고 단정할 수 없지만 어떤게 더 적합한가는 취향이 갈릴 수 있는 문제입니다. 알 수도 없는 값을 제일 먼저 출력하는 것이 보기 싫을 수도 있고 제일 큰 값으로 취급하는 것도 뭔가 어색합니다. 안타깝게도 NULL값의 순서를 지정하는 별도의 명령은 없습니다. ORDER BY의 뒤에 desc를 붙이면 반대의 결과가 나오지만 이 경우 값이 있는 레코드의 순서도 영향을 받아 NULL값의 순서만 조정하는 명령은 아닙니다. 
ULL값의 순서를 조정하려면 여러 가지 방법을 쓸 수 있습니다. 우선 NULL을 특정값으로 가정하는 명령을 사용할 수 있는데 SQL 서버는 ISNULL, 오라클은 NVL, 마리아는 NULLIF를 씁니다. NULL을 충분히 큰 값이나 충분히 작은 값으로 치환하면 원하는 자리에 출력할 수 있습니다.
 
SELECT * FROM tStaff ORDER BY ISNULL(score, 100);
SELECT * FROM tStaff ORDER BY NVL(score, 0);
 
SQL 서버는 score가 NULL일 때 100점으로 치면 NULL이 제일 아래로 내려가며 오라클은 0점으로 치면 제일 위로 올라갑니다. ISNULL(score, 50)이나 NVL(score, 50)으로 지정하면 NULL이 중간쯤에 끼어들기도 하고요. 마리아는 NULLIF(score, 100)으로 해도 말을 듣지 않습니다.
이 방법은 간편하게 쓸 수 있는 방법일 뿐 완벽하지는 않습니다. 충분히 큰값, 충분히 작은 값을 필드 타입에 따라 잘 선정해야 하며 그나마도 DBMS마다 방법이 달라 호환성이 없습니다. 정석적인 방법이 있지만 DBMS마다 조금씩 다릅니다. 오라클이 가장 깔끔합니다.

 
SELECT * FROM tStaff ORDER BY score NULLS first 또는 last;
 
ORDER BY 뒤에 NULLS first 또는 NULLS last 구문으로 NULL을 제일 처음에 둘 것인가 마지막에 둘 것인가를 지정합니다. 디폴트가 last일 뿐 first로 바꿀 수 있어 편리합니다. 마리아는 다음 구문을 사용합니다.
 
SELECT * FROM tStaff ORDER BY score IS NULL ASC, score;
 
NULL인 상태에 대해 오름차순 정렬하면 NULL이 제일 아래로 이동하며 내림차순 정렬하면 제일 위로 올라옵니. 그리고 2차 정렬 기준으로 score를 지정하면 NULL 아닌 행끼리 성적순으로 정렬됩니다. MSSQL의 방식도 이와 유사하되 CASE문을 사용합니다.
 
SELECT * FROM tStaff ORDER BY CASE WHEN score IS NULL THEN 1 ELSE 0 END, score;
 
NULL여부에 따라 1 또는 0의 값을 만든 후 이 값을 1차 정렬 기준으로 사용하고 NULL이 아닌 경우는 성적순으로 정렬합니다.

이래 저래 NULL은 참 골치 아픈 값입니다. 상황에 맞게 가장 적절한 방법을 선택해 쓸 수 밖에 없습니다.




 



개발자의 천국 SoEn

목록보기 삭제 수정 신고 스크랩


로그인하셔야 댓글을 달 수 있습니다.