일반적으로 '자연스럽게'정렬해야하는 숫자와 문자가 혼합 된 문자열 값에 대해보고해야합니다. "P7B18"또는 "P12B3"과 같은 것. @ 문자열은 대부분 문자의 순서이며 숫자가 교대로 나타납니다. 그러나 이러한 세그먼트의 수와 길이는 다를 수 있습니다.
우리는 이것들의 숫자 부분을 숫자 순서로 정렬하고 싶습니다. 분명히 문자열 값을으로 직접 처리하면 ORDER BY
"P1"이 "P7"보다 빠르기 때문에 "P12B3"이 "P7B18"보다 앞에 올 것입니다. "P12".
또한 범위 비교, 예를 들어 @bin < 'P13S6'
또는 일부 를 수행하고 싶습니다 . 부동 소수점이나 음수를 처리 할 필요가 없습니다. 이것들은 우리가 다루는 음이 아닌 정수입니다. 문자열 길이와 세그먼트 수는 고정 된 상한없이 임의적 일 수 있습니다.
우리의 경우 문자열 케이싱은 중요하지 않지만 데이터 정렬 인식 방식 으로이 작업을 수행 할 수있는 방법이 있다면 다른 사람들이 유용 할 수 있습니다. 이 모든 것의 가장 추악한 부분은 WHERE
절 에서 순서와 범위 필터링을 모두 수행하고 싶습니다 .
C # 에서이 작업을 수행하는 경우 꽤 간단한 작업입니다. 알파를 숫자와 분리하고 IComparable을 구현하기 위해 파싱을 수행하면 기본적으로 완료됩니다. 물론 SQL Server는 적어도 내가 아는 한 유사한 기능을 제공하지 않는 것으로 보입니다.
이 작업을 수행하는 좋은 요령을 아는 사람이 있습니까? IComparable을 구현하고 예상대로 동작하는 사용자 지정 CLR 형식을 만드는 약간의 공개 기능이 있습니까? 또한 Stupid XML Tricks (목록 연결 참조)에 반대하지 않으며 서버에서 CLR 정규식 일치 / 추출 / 교체 래퍼 기능을 사용할 수 있습니다.
편집 : 좀 더 자세한 예로써, 데이터가 이와 같이 작동하기를 원합니다.
SELECT bin FROM bins ORDER BY bin
bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
즉, 문자열을 모든 문자 또는 숫자의 토큰으로 나누고 가장 왼쪽의 토큰이 가장 중요한 정렬 용어 인 알파벳 또는 숫자로 각각 정렬합니다. 앞에서 언급했듯이 IComparable을 구현하면 .NET의 케이크 조각이지만 SQL Server에서 어떻게 그런 일을 할 수 있는지 (또는 경우) 알 수 없습니다. 확실히 10 년 정도 일한 적이있는 것은 아닙니다.
P7B12
될 수있는P 07 B 12
(ASCII를 통해) 한 후,80 07 65 12
그래서80076512