Giải pháp đơn giản nhất là đánh dấu trước các số 0
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Tuy nhiên, điều này sẽ không tính đến các ký tự alpha. Để xử lý các ký tự alpha, thì bạn cần biết bạn có thể có bao nhiêu ký tự alpha tiềm năng. Nếu có, bạn có thể làm như sau:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
BỔ SUNG
Chạy thử nghiệm:
If object_id('tempdb..#Test') is not null
Drop Table #Test
Create Table #Test ( NumVal varchar(10) )
Insert #Test(NumVal) Values('02')
Insert #Test(NumVal) Values('03')
Insert #Test(NumVal) Values('1a')
Insert #Test(NumVal) Values('1b')
Insert #Test(NumVal) Values('10')
Insert #Test(NumVal) Values('11')
Select NumVal
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
Results:
1a
1b
02
03
10
11
Một lưu ý về giải pháp của tôi. Nếu trong trường hợp (các) ký tự chữ cái có ý nghĩa đặc biệt, thì như Erick Robertson đã đề xuất, bạn nên chia nhỏ dữ liệu thành các cột riêng biệt. Giải pháp trên sẽ chỉ xử lý hai trường hợp rất cụ thể:một giá trị tất cả là số, một giá trị có một ký tự chữ cái ở cuối. Nếu dữ liệu có thể có nhiều ký tự chữ cái hoặc ký tự chữ cái đôi khi được định vị khác với phần cuối của giá trị, giải pháp của tôi sẽ không hoạt động. Ngoài ra, cần lưu ý rằng giải pháp của tôi sẽ thực hiện quét bảng để đánh giá chuỗi có thể đặt hàng trên mỗi giá trị.
Nếu những gì bạn tìm kiếm là một giải pháp nhanh chóng một lần, thì cách tiếp cận của tôi sẽ hiệu quả. Nếu bạn đang tìm kiếm một giải pháp lâu dài, thì hãy chia nhỏ dữ liệu thành các cột riêng biệt, chấp nhận thứ tự sắp xếp ngốc nghếch hoặc thêm một cột quy định thứ tự sắp xếp tương đối cho mỗi giá trị.