2011-08-03 1 views
0

나는 가축 경매를하는 사람을위한 사이트에서 일하고 있습니다. 그는 롯 1, 롯 2, 롯 3, 롯 3a, 롯 4, 롯 100, 롯트 N으로 동물들을 입력 할 것입니다. 이것은 숫자와 텍스트가 혼합 된 것이므로 길이 (LotName), LotName. * "add on"동물을 입력 할 때까지 작동했습니다 (끝에 'a'로 지정).자연 텍스트와 숫자가 혼합 된 데이터 정렬 (그리고 더 많은 텍스트 * 가끔 *)

어쨌든 SQL을 통해 데이터를 정렬 할 수 있습니까?

* 감사합니다!

답변

2

순수 SQL을 사용합니까? 쉬운 일이 아닙니다!

우리 프로젝트의 코드에서이 작업을 수행했으며 기본적으로 숫자 또는 숫자가 아닌 숫자 (예 : ([0-9]+)|([^0-9]+))와 일치하는 정규식을 적용하고 문자열을 이러한 실행의 튜플로 변환하고 숫자를 그런 다음 쌍으로 비교하여 튜플을 정렬합니다. 예를 들면 :는

"Lot 1" -> ("Lot ", 1) 
"Lot 2" -> ("Lot ", 2) 
"Lot 3" -> ("Lot ", 3) 
"Lot 3a" -> ("Lot ", 3, "a") 
"Lot 100" -> ("Lot ", 100) 

페어 와이즈 비교는 (a) (b) 천연의 정수 순서를 정렬하고, (c), 자연 순으로 정렬 문자열, 문자열 전에 정수를 정렬한다.

정렬을 위해 열에 정규식을 적용 할 수있는 경우 숫자를 고정 길이의 숫자 문자열에 '정규화'하여 0으로 채 웁니다. 좋아요 :

"Lot 1" -> "Lot 0001" 
"Lot 2" -> "Lot 0002" 
"Lot 3" -> "Lot 0003" 
"Lot 3a" -> "Lot 0003a" 
"Lot 100" -> "Lot 0100" 

정확하게 정렬해야합니다. 그러나 Oracle과 일부 다른 데이터베이스에서이 작업을 수행 할 수 있지만 MySQL에서는 user-defined function을 사용해야합니다.

그러나 데이터베이스 외부에서 처리 할 수 ​​있습니다. 로트 테이블에 열을 추가하여 정규화 된 로트 이름을 저장하고 코드에서 행을 삽입 할 때마다 정규화 된 양식을 생성하고 저장하십시오. 그런 다음 해당 열을 사용하여 정렬 할 수 있습니다.

+0

우리는 비슷한 문제가 있었고 별도의 표준화 된 "로트 이름"열에 저장하고 정렬하는 것이 좋습니다. 추가 한 0을 여러 패딩하여 정렬 열을 원래 열보다 길게 만듭니다. –

+0

길이에 관한 좋은 점 - 실제로 많은 추가 패딩 제로를 추가하면 더 길어 지지만 기대하는 많은 숫자 그룹을 곱하면됩니다. –

관련 문제