Natural Sort in MySQL

后端 未结 21 1383
南旧
南旧 2020-11-22 02:25

Is there an elegant way to have performant, natural sorting in a MySQL database?

For example if I have this data set:

  • Final Fantasy
  • Final Fant
21条回答
  •  情话喂你
    2020-11-22 02:57

    A simplified non-udf version of the best response of @plaix/Richard Toth/Luke Hoggett, which works only for the first integer in the field, is

    SELECT name,
    LEAST(
        IFNULL(NULLIF(LOCATE('0', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('1', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('2', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('3', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('4', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('5', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('6', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('7', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('8', name), 0), ~0),
        IFNULL(NULLIF(LOCATE('9', name), 0), ~0)
    ) AS first_int
    FROM table
    ORDER BY IF(first_int = ~0, name, CONCAT(
        SUBSTR(name, 1, first_int - 1),
        LPAD(CAST(SUBSTR(name, first_int) AS UNSIGNED), LENGTH(~0), '0'),
        SUBSTR(name, first_int + LENGTH(CAST(SUBSTR(name, first_int) AS UNSIGNED)))
    )) ASC
    

提交回复
热议问题