2012-09-06 34 views
5

Tôi có một bảng các bài đăng có tiêu đề theo thứ tự chữ cái "con người" chứ không phải theo thứ tự bảng chữ cái của máy tính. Đây là hai hương vị, số và chữ cái:ORDERBY thứ tự chữ cái "con người" bằng cách sử dụng thao tác chuỗi SQL

  • bằng số: Hình 1.9, Hình 1.10, hình 1.11 ...

  • thứ tự chữ cái: Hình 1A ... Hình 1Z .. . Hình 1AA

Nếu tôi orderby tiêu đề, kết quả là 1,10-1,19 đến giữa 1.1 và 1.2, và 1AA-1AZ đến giữa 1A và 1B. Nhưng đây không phải là điều tôi muốn; Tôi muốn thứ tự chữ cái "con người", trong đó 1,10 xuất hiện sau 1,9 và 1AA xuất hiện sau 1Z.

Tôi tự hỏi nếu vẫn còn một cách trong SQL để có được thứ tự mà tôi muốn sử dụng thao tác chuỗi (hoặc cái gì khác mà tôi đã không nghĩ đến).

Tôi không phải là một chuyên gia trong SQL, vì vậy tôi không biết nếu điều này là có thể, nhưng nếu có một cách để làm thay thế có điều kiện, sau đó có vẻ như tôi có thể áp đặt trật tự tôi muốn bằng cách làm này:

  1. xóa giai đoạn (có thể được thực hiện với replace, phải không?)

  2. nếu số nhân vật còn lại là hơn ba ký tự, thêm một 0 (zero) sau ký tự đầu tiên.

Điều này dường như để cho tôi kết quả tôi muốn: 1.9 sẽ trở thành 109, mà xuất phát trước khi 110; 1Z sẽ trở thành 10Z, xuất hiện trước 1AA. Nhưng nó có thể được thực hiện trong SQL? Nếu vậy, cú pháp sẽ là gì?

Lưu ý rằng tôi không muốn tự sửa đổi dữ liệu — chỉ để xuất kết quả của truy vấn theo thứ tự được mô tả.

Đây là ngữ cảnh của một cài đặt Wordpress, nhưng tôi nghĩ câu hỏi phù hợp hơn là một câu hỏi SQL bởi vì nhiều thứ khác nhau (chẳng hạn như phân trang) phụ thuộc vào thứ tự xảy ra ở giai đoạn truy vấn MySQL, chứ không phải trong PHP.

+0

Đáng buồn thay, tôi nghĩ rằng đặt cược tốt nhất của bạn sẽ phải thiết lập một bảng tra cứu để '1 => 1,1' và' 10 = 1,10'. – Kermit

+0

Các giá trị bạn đang thực sự làm việc với: "1.1", "Hình 1.1", hoặc "Hình 1.1 Đây là chú thích cho hình"? –

+1

Đó là một ý tưởng tồi nhỉ? Sẽ có sự kết hợp giữa số và alpha để sắp xếp trong một lựa chọn không? Nếu vậy chúng ta có thể giả định rằng 1Z được theo sau bởi 2.0? –

Trả lời

0

Suy nghĩ đầu tiên của tôi là thêm cột bổ sung được cập nhật bởi trình kích hoạt hoặc cơ chế bên ngoài khác.

1) Sử dụng cột đó để thực hiện theo thứ tự 2) Dù cơ chế cập nhật cột sẽ có logic để tạo thứ tự chấp nhận được bằng thay thế (ví dụ: nó sẽ biến thành 1.1 thành AAA hoặc tương tự).

Bất kể ... điều này sẽ là một nỗi đau. Tôi không evny bạn.

0

Bạn có thể tạo chức năng mà có logic để có thứ tự sắp xếp của con người như

Alter FUNCTION [dbo].[GetHumanSortOrder] (@ColumnName VARCHAR(50)) 
RETURNS VARCHAR(20) 
AS 

BEGIN 
DECLARE @HumanSortOrder VARCHAR(20) 

SELECT @HumanSortOrder = 
CASE 
    WHEN (LEN(replace(replace(<Column_Name>,'.',''),'Figure ',''))) = 2 
THEN 
CONCAT (SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),1,1),'0',SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),2,2)) 
    ELSE 
     replace(replace(<Column_Name>,'.',''),'Figure ','') 
     END 
FROM <Table_Name> AS a (NOLOCK) 
WHERE <Column_Name> = @ColumnName 

RETURN @HumanSortOrder 

END 

chức năng này cung cấp cho bạn như 104,107,119,10A, 10B vv như mong muốn

Và bạn có thể sử dụng chức năng này, trật tự do

SELECT * FROM <Table_Name> ORDER BY GetHumanSortOrder(<Column_Name>) 

Hope this helps

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