2010-01-07 50 views
3

是否有可能以下列方式在MySQL中的字母順序排列:SQL順序按字母前沒有零的數字小於10

A1
A2
A3
A5
A10
A11
A20
A23
A24

Unfortu最近我訂購的訂單如下面所示。注意A10之前的任何數字是不是分組在一起的?

A1
A10
A11
A12
A2 < A2
A20
A23
A24
A3 < A3
A5 < A5

注: 這些字母數字串實際上是郵政代碼,所以我不能放A01,因爲這在技術上不是郵政編碼前綴。我還想避免讓用戶輸入其他數據來幫助系統正確排序,因爲我的用戶不是非常瞭解網絡。而且,這些字母數字字符串將無法以正確的順序輸入到數據庫中,因爲它們可以隨時刪除和添加。

+0

做真正的郵政編碼,你總是以一個字母開頭,或者它是可變的嗎? – 2010-01-07 05:50:27

回答

3

如果字符串中的位置是一致的,則可以使用表達式來挑選字符串的數字部分。然後通過給它加零來強制數字字符串的整數值。

... 
ORDER BY SUBSTR(postalcode,2)+0 
+0

這很棒!還有其他字母也涉及到,但我可以使用類似這樣的方法:ORDER BY SUBSTR(letter_portion),SUBSTR(number_portion)。如果郵政編碼沒有一致的定位,那麼我很可能會使用尼爾的反應。謝謝! – justinl 2010-01-07 06:04:25

+0

強制部分是光滑的,我不會想到它。 – 2010-01-07 06:29:16

5

創建一個將您的varchar轉換爲數值的UDF。然後在查詢的ORDER BY子句中使用該函數。

基本上,你的函數將爲每一行分配一個數值,比如A的ASCII值(或者任何第一個字母)* 100 + varchar其餘部分的解析數字。

0

一個解決方案是準確計算出郵政編碼的格式,然後將其分解爲各個部分。假設它是州,郵編:所以你可以有NC27605。然後,您可以分別保存狀態和zip_code,並將郵政編碼作爲計算值。然後讓他們按順序將意味着排序狀態,然後zip_code。

這總是被認爲是很好的風格;數據庫的重點在於讓所有獨立的數據位都可以獨立訪問。

0

訂購按字母順序排列。

但是你想訂購它們就好像它們是數字一樣。不幸的是,ASC和DESC沒有提供很大的靈活性。

的MySQL,新騎士,2000年,一份由保羅·杜波依斯(現在有點過時了)說

在MySQL 3.23.2中,您也可以 指定表達式爲排序 列。例如,`ORDER BY RAND()如果此功能仍然可用,你可以找到一個內置函數或強制轉換爲VARCHAR轉換爲整數 返回行按隨機順序

,將它有可能ORDER BY那功能?或者,我讀得太多了?

嗯,我認爲比爾卡爾文表達最好。