MySQL에서 열을 정렬하면서 0을 마지막에 배치하는 방법
MySQL에서는 ORDER BY 절을 활용해 열을 정렬하면서 값이 0인 행을 마지막에 배치할 수 있습니다. 일반적인 오름차순 정렬에서는 0이 가장 앞에 오지만, 간단한 비교 표현식을 추가하면 이 순서를 손쉽게 바꿀 수 있습니다.
기본 문법
select *from yourTableName order by yourFieldName = 0, yourFieldName;
여기서 핵심은 yourFieldName = 0이라는 불리언 표현식입니다. MySQL에서 비교 연산의 결과는 참일 때 1, 거짓일 때 0으로 반환됩니다. 따라서 0이 아닌 값은 1로 평가되어 먼저 정렬되고, 0인 값은 0으로 평가되어 결과적으로 맨 뒤로 밀려나게 됩니다.
예제 테이블 생성
개념을 이해하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table SortColumnZeroAtLastDemo
-> (
-> RankNumber int
-> );
Query OK, 0 rows affected (1.40 sec)
레코드 삽입
다음 쿼리를 사용해 테이블에 레코드를 삽입합니다.
mysql> insert into SortColumnZeroAtLastDemo values(100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.11 sec)
mysql> insert into SortColumnZeroAtLastDemo values(50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into SortColumnZeroAtLastDemo values(10);
Query OK, 1 row affected (0.15 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into SortColumnZeroAtLastDemo values(40);
Query OK, 1 row affected (0.12 sec)
전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from SortColumnZeroAtLastDemo;
출력 결과는 다음과 같습니다.
+------------+
| RankNumber |
+------------+
| 100 |
| 0 |
| 0 |
| 50 |
| 10 |
| 0 |
| 40 |
+------------+
7 rows in set (0.00 sec)
0을 마지막에 배치하며 정렬하기
앞서 소개한 문법을 적용해 0을 마지막으로 보내면서 열을 정렬하는 쿼리는 다음과 같습니다.
mysql> select *from SortColumnZeroAtLastDemo order by RankNumber = 0, RankNumber;
실행 결과를 확인해 보면 0이 아닌 값들은 오름차순으로 먼저 정렬되고, 0인 행들은 모두 마지막에 배치된 것을 볼 수 있습니다.
+------------+
| RankNumber |
+------------+
| 10 |
| 40 |
| 50 |
| 100 |
| 0 |
| 0 |
| 0 |
+------------+
7 rows in set (0.00 sec)
내림차순 정렬이 필요할 때
0이 아닌 값들을 내림차순으로 정렬하고 싶다면, 전체 쿼리에 DESC를 붙이는 것이 아니라 두 번째 정렬 기준에만 DESC를 적용해야 합니다.
select *from yourTableName order by yourFieldName = 0, yourFieldName desc;
이렇게 작성하면 0이 아닌 값들은 큰 순서대로 정렬되고, 0은 여전히 마지막에 위치하게 됩니다. 또한 CASE 표현식을 사용해 ORDER BY CASE WHEN yourFieldName = 0 THEN 1 ELSE 0 END, yourFieldName처럼 작성하면 더욱 명시적으로 의도를 표현할 수 있습니다.