2012-03-16 33 views
1

我有以下的紀錄,需要給他們相應的分類:排序文本字段

AB*1 
AB*2 
AB*10 
AB*100 

我使用下面的SQL語句,其完美的作品,但僅限於被過濾特定條件的記錄。

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY LEN(Column1), Column1 
WHERE Column1 Like 'AB*' 

當我刪除了Where子句中的例子中,記錄AB * 100下方出現一路下滑。明顯的是,它將所有記錄與長度爲4的組合在一起,然後從長度爲5的記錄開始全部重複,等等。

在將星號分組在一起並排序正確之前,是否可以對這些命令進行排序?

+0

星號前總是2個字符? – 2012-03-16 13:33:30

+0

可悲的是,沒有。也。在星號之後,大部分是數字,但很少是字母數字(例如1A,2A等)。 – Rick 2012-03-16 13:37:06

+0

請給出更多的異構輸入和期望的輸出。你想在Access中這個? – 2012-03-16 13:41:34

回答

1

這很可能是緩慢的:使用

ORDER BY Mid(Column1,1,Instr(Column1,"*")) 

編輯再評論

SELECT Column1 
FROM Table 
ORDER BY Mid([Column1],1,InStr([Column1],"*")), 
     Val(Mid([Column1],InStr([Column1],"*")+1)); 

的樣本數據在測試中:

ID 
ab*1 
ab*10 
ab*2 
abcdef*a1 
abcdef*10 
abcdef*40a 

對於空值,只需添加幾個零長度的字符串。

SELECT column1 
FROM Table 
ORDER BY Mid([column1] & "",1,InStr([column1] & "","*")), 
     Val(Mid([column1] & "",InStr([column1] & "","*")+1)); 
+0

不慢,但產生以下順序:AB * 1,AB * 12,AB * 14,AB * 10,AB * 11,AB * 13,AB * 5,AB * 2 ... – Rick 2012-03-20 14:54:46

+0

請嘗試以下操作: ORDER BY Mid(Column1,1,Instr(Column1,「*」))ASC,Mid(Column1,InStr(Column1,「*」)+ 1,Len(Column1))ASC,但在條件表達式中得到「數據類型不匹配「 錯誤信息。我的想法是嘗試在星號之後排序,然後是一些字母。 – Rick 2012-03-20 15:00:25

+0

嗨@瑞克,我不太清楚你想要什麼。我已經添加了一個註釋。 – Fionnuala 2012-03-20 15:05:35

1

看來這會做你想要什麼,除非我誤解

SELECT  Column1 
FROM  dbo.Table1 
ORDER BY left(Column1,2), LEN(Column1) 
2

「按字母順序排列」的第一個字符實際上是「無字符」。所以它不是「一串4先來」。例如,以下是爲了...

AB*1 
AB*2 
AB*10 
AB*100 
CD*1 
CD*2 
CD*10 
CD*100 

可能順序由前3個字符的字符串,並且後的字符爲數字。只要是你的數據的行爲......

ORDER BY 
    LEFT(column1, 3), 
    CLNG(MID(column1, 4, 8000)) 

,或者你可以拉長你的價值觀,責令彷彿他們看上去像這樣...

AB*100 
AB*10Z 
AB*1ZZ 
AB*2ZZ 

使用這種ORDER BY的聲明...

ORDER BY 
    column1 & string(8000 - LEN(column1), "z") 


但是,這些都是強制「非自然」排序的解決方法,因爲目前您正在獲得「正確」排序。

+0

您如何看待CAST使用MS Access? (SQL是一個通用的標籤。) – Fionnuala 2012-03-16 14:03:53

+0

@Remou - 衛生署,我查了'padright()'equivilent,而不是演員。它應該是... *''CLNG()'* – MatBailie 2012-03-16 14:07:23

+0

在這兩個示例中,我都會收到錯誤:「表達式中的數據類型不匹配標準」。在星號之前沒有固定長度,可以是一個字符或四個字符。 – Rick 2012-03-20 15:05:37