2010-07-01 40 views
7

Tôi có một cột thường chỉ là số (đôi khi là chữ cái, nhưng điều đó không quan trọng).Sắp xếp tự nhiên cho SQL Server?

Tôi làm cách nào để sắp xếp tự nhiên?

Hiện nay phân loại như thế này: {} 1,10,11,12,2,3,4,5,6,7,8,9

Tôi muốn nó sắp xếp như thế này: {1,2 , 3,4,5,6,7,8,9,10,11,12}

Trả lời

6

IsNumeric là "bị hỏng", ISNUMERIC (CHAR (13)) trả về 1 và CAST sẽ không thành công.

Sử dụng ISNUMERIC (textval + 'e0'). mã cuối cùng:

ORDER BY 
    PropertyName, 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END, 
    MixedField 

Bạn có thể kết hợp các thông số theo thứ tự ...

+0

Hầu như ở đó, không sắp xếp số không chỉ cần thêm chúng cho đến khi kết thúc. Tôi sẽ sửa đổi truy vấn của bạn và chấp nhận nó – Malfist

-3

bạn đã gắn liền với sử dụng:

'OrderBy ColumnName Asc'

vào cuối truy vấn của bạn.

+8

Đó không phải là một loại tự nhiên, đó là một loại ASCII. – Malfist

1

Truyền. Ngoài ra, đừng quên sử dụng IsNumeric để đảm bảo bạn chỉ lấy lại các con số (nếu chúng bao gồm các chữ cái thì nó quan trọng;).

SELECT textval FROM tablename 
WHERE IsNumeric(textval) = 1 
ORDER BY CAST(textval as int) 

Ngoài ra, truyền tới kiểu dữ liệu sẽ giữ giá trị lớn nhất.

Nếu bạn cần các số không trong tập kết quả thì chỉ cần nối thêm truy vấn UNION trong đó IsNumeric = 0 (thứ tự theo bất kỳ thứ gì bạn muốn) trước hoặc sau.

+0

Vấn đề với công đoàn là loại này không phải là loại cấp đầu tiên. Sắp xếp đầu tiên là theo Tên thuộc tính và sắp xếp này là theo Số đơn vị (thường là số nhưng có thể là A, B, C, ...) Liên kết sẽ ném rất nhiều ra khỏi – Malfist

Các vấn đề liên quan