2013-02-18 126 views
0

我在SQL以下數據:MySQL的排序VARCHAR字段

name  ID 
A[0]  1 
A[1]  1 
A[2]  1 
AA[0]  2 
AA[15]  2 
AA[27]  2 

我想首先由ID,然後通過名稱進行排序該數據,。按ID排序很容易,因爲它是一個int,問題在於名稱 - 我得到奇怪的值,例如a [7],a [27],a [3],當我試圖按數字排序時。當排序alfolbetically我得到你所期望的,a [10],a [11] ... a [19],[2]等
我認爲這是因爲該字段是一個varchar並具有數值和文本部分。有沒有什麼辦法來排序呢?將它分割成子字符串似乎是一個不好的選擇,因爲每個部分的長度(文本和數字)不是恆定的。
謝謝!

+0

什麼是你的SELECT語句的樣子(通過拆分或獲取子獲得)? – Hituptony 2013-02-18 14:15:28

回答

1

爲您的要求,可以考慮分離柱中,以兩個部分(即A [20]將成爲A和20),並通過產生的分裂值的組合順序。

所以您的查詢就會看樣訂貨的ID,名稱第一部分,TO_NUMBER(名稱 - 第二部分)

+0

我希望有一個更直接的方法:(但是,如果沒有其他工作,我會做到這一點 – 2013-02-18 14:20:49

+0

我試過了,它確實解決了我的問題,謝謝:) – 2013-02-19 10:46:15

-2

好吧,你想要麼創建這樣的使用功能或在名稱字段

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ''); 

見參考文獻使用一個子 - http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

但也應該注意到,如果你發現自己不得不拆分列,這將會在將來爲您帶來查詢性能問題,因爲底層數據庫設計存在缺陷。我會使用split函數重新創建該表格,並將其分成兩列。有三個級別的規範化數據庫,您應在繼續閱讀之前閱讀這些數據庫。

還 - Split value from one field to two

+0

我希望我的排序能夠返回上面的列表 - 我已經按照排序後應該看起來的方式編寫它。如果我通過ID,名稱命令然後SQL不考慮括號中的數字,它只是按字母順序命令 – 2013-02-18 14:19:29

+0

你沒有說。你說按名稱排序會得到奇怪的值。目前還不清楚你是否曾經同時訂購過,它只是說int不是問題,而且是字母表。因此兩者都是解決方案。但無論如何,讓我想辦法 – Hituptony 2013-02-18 14:20:53

+0

「 - 當我嘗試按照數字排序時,我會得到奇怪的值,例如a [7],a [27],[3];當排序時,我會得到你所期望的, a [10],a [11] ... a [19],a [2]等「問題是當我嘗試排序數字時,因爲字段中有很多文字 – 2013-02-18 14:29:47