2012-09-06 42 views
5

我有一個帖子的表格,標題是按照「人類」字母順序排列,但不是以計算機字母順序排列。這是兩種口味,數字和字母:ORDERBY使用SQL字符串操作的「人類」字母順序

  • 數字:圖1.9,圖1.10,圖1.11 ...

  • 字母:圖1A ...圖1Z .. 。圖1AA

如果我orderby標題,其結果是,來1.1和1.2之間1.10-1.19,和1AA-1AZ來1A和1B之間。但這不是我想要的;我想要「人類」字母順序,其中1.10之後1.9和1AA來到1Z之後。

我想知道是否仍然有辦法在SQL中獲取我想要使用字符串操作(或其他我沒有想到的)的順序。

我不是SQL方面的專家,所以我不知道這是可能的,但如果有一種方法可以做到有條件更換的話,好像我可以做這個強加給我想要的順序:

  1. 刪除週期(可以用replace做,對不對?)

  2. 如果剩餘的人物數量超過三個字符,第一個字符後添加0(零)。

這似乎給我我想要的結果:1.9將成爲109110之前這來; 1Z將變爲10Z,其在1AA之前。但是它可以在SQL中完成嗎?如果是這樣,語法是什麼?

請注意,我不想修改數據本身 - 只是以所述順序輸出查詢結果。

這是在Wordpress安裝的上下文中,但我認爲這個問題更適合一個SQL問題,因爲各種事情(例如分頁)依賴於在MySQL查詢階段發生的排序,而不是在PHP中。

+0

可悲的是,我想你最好的選擇將設置一個查找表,以便'1 => 1.1'和'10 = 1.10'。 – Kermit

+0

您實際使用的值是什麼:「1.1」,「圖1.1」或「圖1.1這是圖的標題」? –

+1

我的那個主意不好,不是嗎?是否會混合使用數字和alpha來排序?如果是這樣,我們可以假設1Z跟着2.0? –

回答

0

我的第一個想法是添加一個由觸發器或其他外部機制更新的附加列。 2)無論哪種機制更新列,都會有邏輯通過代理創建可接受的順序(例如,它會將1.1變成AAA或類似的東西)。

無論如何...這將是一個痛苦。我不是你。

0

您可以創建一個有邏輯有人類的排序順序一樣

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 

此功能功能讓你喜歡104,107,119,10A,10B等根據需要

,您可以通過使用此功能,訂單

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

希望這有助於