Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 열 기준으로 정렬하면서 빈 레코드를 마지막에 배치하는 방법

MySQL에서 특정 열을 기준으로 데이터를 정렬하면서 빈 값(NULL 또는 공백)을 가진 레코드를 결과의 맨 끝에 배치하려면 ORDER BY 절과 IS NULL 조건을 함께 활용하면 됩니다.

기본 문법

select *from yourTableName order by if(yourColumName = '' or yourColumName is null,1,0),yourColumnName;

이 문법의 핵심은 IF() 함수입니다. 해당 열의 값이 빈 문자열이거나 NULL이면 1을 반환하고, 그렇지 않으면 0을 반환합니다. 오름차순 정렬에서는 0이 1보다 앞에 오므로, 값이 있는 레코드가 먼저 정렬되고 빈 레코드는 자연스럽게 마지막으로 밀려나게 됩니다.

예제 테이블 생성

문법을 실제로 이해하기 위해 테이블을 하나 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.

mysql> create table emptyCellsAtEnd
    -> (
    -> ProductId varchar(100)
    -> );
Query OK, 0 rows affected (0.65 sec)

샘플 데이터 삽입

이제 INSERT 명령으로 몇 개의 레코드를 삽입합니다. 이 중 일부는 의도적으로 빈 값을 넣었습니다.

mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.23 sec)

mysql> insert into emptyCellsAtEnd values('P-1');
Query OK, 1 row affected (0.21 sec)

mysql> insert into emptyCellsAtEnd values('P-2');
Query OK, 1 row affected (0.14 sec)

mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.15 sec)

mysql> insert into emptyCellsAtEnd values('P-3');
Query OK, 1 row affected (0.18 sec)

mysql> insert into emptyCellsAtEnd values('P-4');
Query OK, 1 row affected (0.09 sec)

mysql> insert into emptyCellsAtEnd values('P-9');
Query OK, 1 row affected (0.11 sec)

mysql> insert into emptyCellsAtEnd values('');
Query OK, 1 row affected (0.15 sec)

mysql> insert into emptyCellsAtEnd values('P-8');
Query OK, 1 row affected (0.17 sec)

현재 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from emptyCellsAtEnd;

실행 결과는 다음과 같습니다. 빈 값들이 중간중간 섞여 있는 것을 확인할 수 있습니다.

+-----------+
| ProductId |
+-----------+
|           |
| P-1       |
| P-2       |
|           |
| P-3       |
| P-4       |
| P-9       |
|           |
| P-8       |
+-----------+
9 rows in set (0.00 sec)

빈 레코드를 끝으로 보내는 쿼리 실행

이제 앞서 소개한 쿼리를 적용하여 빈 셀을 가진 레코드를 결과의 맨 끝으로 배치해 보겠습니다.

mysql> select *from emptyCellsAtEnd
-> order by if(ProductId = '' or ProductId is null,1,0),ProductId;

실행 결과는 다음과 같습니다.

+-----------+
| ProductId |
+-----------+
| P-1       |
| P-2       |
| P-3       |
| P-4       |
| P-8       |
| P-9       |
|           |
|           |
|           |
+-----------+
9 rows in set (0.00 sec)

결과 분석

위 출력 결과를 보면 ProductId 값이 있는 레코드(P-1부터 P-9까지)가 알파벳 순서대로 먼저 정렬되고, 빈 값(공백 문자열)을 가진 세 개의 레코드가 모두 맨 끝에 배치된 것을 확인할 수 있습니다.

이 방식은 NULL과 빈 문자열을 모두 처리하므로, 두 경우가 혼재된 실무 데이터에서도 안정적으로 동작합니다. 만약 내림차순으로 정렬하면서 빈 레코드를 끝에 두고 싶다면, 각 정렬 기준 뒤에 DESC를 붙여 order by if(...) DESC, yourColumnName DESC 형태로 작성하면 됩니다.