MySQL order by (str to int)

后端 未结 1 1896
梦谈多话
梦谈多话 2020-12-19 07:13
SELECT `01` FROM perf WHERE year = \'2013\' order by CAST(`01` AS INT) LIMIT 3

Column 01 has numeric values as varchar. I need to order top 3 of \'

相关标签:
1条回答
  • 2020-12-19 07:53

    MySQL doesn't permit you to CAST('01' AS INT). It expects instead a SIGNED or UNSIGNED.

    SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS SIGNED) LIMIT 3
    

    Review the MySQL docs on CAST() for full details.

    mysql> SELECT CAST('01' AS SIGNED);
    +----------------------+
    | CAST('01' AS SIGNED) |
    +----------------------+
    |                    1 |
    +----------------------+
    1 row in set (0.00 sec)
    

    To force the non-numeric strings to be sorted last, you will need to apply a CASE in the ORDER BY which assigns them an absurdly high value. The condition should test that the value in 01 is not equal to 0, and when cast to a SIGNED the result is not 0, owing to the fact that non-numeric strings will cast to zero.

    If those conditions are not met, the string is assumed to be non-numeric, and given a value of 999999999 in the ORDER BY, which pushes them to the end. They're subsequently ordered by name.

    SELECT * FROM perf 
    WHERE year = '2013'
    ORDER BY
      CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE 999999999 END,
      name
    LIMIT 3
    

    http://sqlfiddle.com/#!2/846e2/6

    To make these sort descending, use an absurdly low value (negative) instead of a high value

      CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE -999999999 END DESC,
    
    0 讨论(0)
提交回复
热议问题