숫자로 된 문자열의 정렬 문제 해결

2023. 12. 18. 12:51Database/Oracle

회사에서 일하면서 문자로 되어 있는 숫자를 정렬할 필요성이 있는데 데이터베이스를 본인이 만든것이 아니기에 왜 이건 NUMBER타입이 아니라 VARCHAR으로 만들었는지 의문스럽지만 정렬을 할때가 있는데 보면 글자이기에 그냥 순수하게 정렬을 하면 문제점이 발생한다. 이에 대한 해결 방법에 대해 정리해보자.

 

1. 문제점 

 

임의로 문자 컬럼에 숫자 데이터로 삽입하고 정렬을 해보면

 

위와 같이 문제 없이 정렬되는 것을 볼수 있는데 여기서 문제점은 아래와 같은 경우에 발생한다.

아래에 보면 10,110, 20 ,1110의 데이터를 가지고 있는데 우리의 바램은 이게 10 - 20 - 110 - 1110으로 정렬되어야 할것 같지만 아래를 보면 데이터의 정렬이 원하는대로 되지 않는 것을 볼 수 있다.

이는 문자열 형식의 컬럼은 사전식 정렬하기 때문에 발생하는 것이다. 

사전식 정렬은 각 문자의 유니코드 값을 기준으로 정렬하는 방식으로 이는 문자와 숫자를 구분하지 않고 정렬하기에 일부 경우 예상과 다른 순서로 정렬될수 있다.

 

쉽게 예시를 두면 올림픽에서 금메달, 은메달, 동메달이 있을때 은메달, 동메달의 갯수가 아무리 많아도 금메달이 없으면 금메달을 기준으로 순위가 결정되는 것과 동일하다고 보면 된다.

1이 맨앞에 있으면 금메달처럼 가장 우선 순위에 놓이고 다른 숫자는 후순위로 밀리는 것임

 

그렇기에 문자열 형식으로 숫자를 크기별로 정렬하기 위해서는 ORDER BY에 추가적으로 처리를 해줘야 한다.

 

2. 해결방법 

해결방법은 사실 어렵지 않다. 해결방법을 아래에서 알아보자.

 

   1) 컬럼을 숫자형식으로 변경

ORDER BY 하는 컬럼을 TO_NUMBER를 사용해서 숫자 형식으로 변경하면서 ORDER BY로 정렬하는 방법이다.

 

 

이때는 해당 컬럼의 문자열에 문제가 있으면 에러를 발생시킬 수도 있기에 이를 유의해야 한다.

 

   2)LPAD를 사용하여 0으로 채워 정렬하기 

컬럼의 길이만큼 0을 채워넣고 정렬하는 방법이 있다.

 

'Database > Oracle' 카테고리의 다른 글

GROUP BY  (0) 2023.10.26
SELECT의 실행순서  (0) 2023.10.25