2014-02-13 40 views
0

我有一行有兩個數字螞蟻字符串。我想訂購它,這樣數字將作爲數字排序,所有的字符串都會到達表格的末尾。SQL order varchar(小數點)

ORDER BY (
      CASE 
       WHEN `{$table}`.`{$row}` LIKE '%[^0-9]%' 
        THEN CAST(`{$table}`.`{$row}` AS DECIMAL) 
       ELSE `{$table}`.`{$row}` 
      END 
     ) ASC" 

但是,數字仍然像字符串排序。

Results: 
0 
410 
680 
72 
Some other string 
Some string 


It should be: 
0 
72 
410 
680 
Some other string 
Some string 
+1

你確定你正在使用MySQL的?你的'like'表達式(用於你的意圖)由SQL Server支持,但不支持MySQL。 –

+0

我有一個懷疑,它有點像 – Benedictus

+0

@GordonLinoff有沒有一種方法來檢查字符串是否與MySQL數字? – Benedictus

回答

1

嘗試這種情況:

order by (case when left(`{$table}`.`{$row}`, 1) between '0' and '9' then 0 else 1 end), 
     `{$table}`.`{$row}` + 0, 
     `{$table}`.`{$row}` 

第一個表達式把第一數字(或在以數字開頭至少字符串)。第二個是一個很好的MySQL功能,它將字符串轉換爲數字。第三種排序非數字字符串。

編輯:

要具有唯一編號(而不是領先的數字)先走:

order by (case when left(`{$table}`.`{$row}`, 1) REGEXP '^-?[0-9]+$' then 0 else 1 end), 
     `{$table}`.`{$row}` + 0, 
     `{$table}`.`{$row}` 
+0

如果我把整個事情弄得相反呢?[string 10 9 4 0] – Benedictus

+1

@Benedictus你可以在第一個條件中加上一個'desc'。 –

+0

在這個查詢中12abc將會被計爲整數,對嗎?我寧願把它算作一個字符串,我該怎麼做? – Benedictus

0

如何以下(SQL Fiddle):

SELECT * FROM 
(
    SELECT field1 
    FROM MyTable 
    WHERE field1 REGEXP '^-?[0-9]+$' 
    ORDER BY CAST(field1 AS DECIMAL) 
)AS m 
UNION 
SELECT * FROM 
(
    SELECT field1 
    FROM MyTable 
    WHERE field1 NOT REGEXP '^-?[0-9]+$' 
    ORDER BY field1 
) AS mm 
+0

。。union all '不保證排序,'union'肯定不會。 –