Đây là một mẹo:Bất cứ khi nào bạn gặp vấn đề với việc sắp xếp, hãy thêm thứ tự theo các mục vào mệnh đề đã chọn của bạn. điều này sẽ cho phép bạn xem liệu những gì bạn đang sắp xếp có thực sự là những gì bạn muốn sắp xếp theo hay không:
SELECT Section,
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
ELSE
Section
END As alphabetical_sort, -- alphabetical sort
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
ELSE
NULL
END As Numeric_Sort
FROM dbo.Section
ORDER BY alphabetical_sort, Numeric_Sort
Sau khi tôi đã sắp xếp chính xác, Tất cả những gì tôi phải làm là chuyển các câu lệnh trường hợp sang mệnh đề theo thứ tự:
SELECT Section
FROM dbo.Section
ORDER BY
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
ELSE
Section
END , -- Alphabetical sort
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
ELSE
NULL
END -- Numeric sort
Về cơ bản, Bạn gặp 4 vấn đề chính:
- Biểu thức sắp xếp theo thứ tự bảng chữ cái của bạn giả định rằng mọi hàng đều có số.
- Biểu thức sắp xếp theo thứ tự bảng chữ cái của bạn chứa các số cũng như văn bản.
- Biểu thức sắp xếp số của bạn có cả giá trị số và bảng chữ cái.
- Vì điều 3, bạn không thể chuyển biểu thức sắp xếp số của mình sang kiểu số và đây là lý do tại sao bạn sẽ nhận được một loại chuỗi.