이 세상에 하나는 남기고 가자

이 세상에 하나는 남기고 가자

세상에 필요한 소스코드 한줄 남기고 가자

MySql에서 숫자로 시작하는 문자열의 정렬 문제

유영재

[100A, 9B, 10C] 와 같은 문자열의 배열을 정렬한다고 가정하자. 인간이 생각할 때 바른 정렬 결과는 [9B, 10C, 100A]일 것이다.(사람에 따라 다를 수는 있지만 나는 이렇게 되길 원한다.) 그런데 이 문제를 프로그램에서 처리하려고 그냥 정렬을 수행한다면 어떤 결과가 나올까?

결과는 [100A, 10C, 9B] 이다. 간단히 결과를 확인하기 위해 php에서 돌려본 결과이다.

<?php
$a = ['100A', '9B', '10C'];
sort($a);
print_r($a);

// 실행 결과
Array
(
    [0] => 100A
    [1] => 10C
    [2] => 9B
)

왜 이런 정렬 결과가 나올까? 어떻게보면 당연할 결과이다. 프로그램에서는 숫자든 문자든 문자열 내부에서는 숫자 코드로 처리된다. 그러므로 맨 첫자리 문자부터 비교를 시작하여 차례로 정렬하므로 1로 시작하는 문자열이 처음으로 들어온다. 100A, 10C 두 문자열을 비교하자면 셋째자리에서 0과 C가 비교되어 0을 가진 100A가 먼저 들어가게 된다.

그럼 인간이 생각하는 것처럼 정렬되게 하려면 어떻게 할까? 복잡하게 생각하자면 한도 끝도 없이 복잡할 수 있지만 간단하게 생각하자면 비교되어야 할 문자의 위치를 맞추어주면 원하는 결과를 얻을 수 있다.

다른 언어나 상황에서도 마찬가지 방법으로 적용할 수 있지만 이번엔 MySql에서 정렬시 이 부분이 필요했기 때문에 MySql에서 사용한 방법을 아래에 적는다.

SELECT *, LPAD(strField, 7, 0) as strFieldOrder FROM table1 ORDER BY strFieldOrder;

여기서 주의할 것은 7이라는 부분을 데이터의 길이가 모두 포함될 수 있는 적절한 값으로 지정해야 한다는 것이다.

comments powered by Disqus