SQL order varchar as decimals

时间:2014-02-13 16:27:10

标签: mysql sql casting sql-order-by

我有一行有两个数字蚂蚁字符串。我想订购它,以便数字将作为数字排序,所有字符串将到达表的末尾。

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

2 个答案:

答案 0 :(得分: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}`

答案 1 :(得分: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