SQL 中的自然排序不起作用

Natural sorting in SQL does not work

我正在尝试对 SQL 中的一行 "naturally" 进行排序,我发现了这个答案,据说它完全符合我的需要:

但是当我尝试在 "SQL Fiddle" 中重新创建它时,我无法让它工作...

Here's my attempt

我做错了什么?

对于给定的数据库架构,您的尝试是否必要?

尝试这样的事情,

SELECT `test`
FROM table1
ORDER BY LENGTH(`test`),
         `test`;

假设 (!) 您的数据格式为 "blabla-integer",并且只有一个破折号 (-) 将字母数字部分与整数部分分开,我会这样做:

select * from table1
order by cast(substring(test, 
                        locate('-', test) + 1, 
                        length(test) - locate('-', test)
                       ) as signed integer
             );

您引用的示例与您自己的试验之间的区别在于,您的 数据在同一字段中结合了数字和非数字字符,因此转换为整数不会' t 工作(它只给出 0)。您可以通过在 select 列表中添加 order by 表达式来想象为什么查询不适合您,如下所示:

SELECT test
       ,test REGEXP '^[A-Za-z]+$'
       ,CAST(test as SIGNED INTEGER)
       ,CAST(REPLACE(test,'-','')AS SIGNED INTEGER)
FROM table1
ORDER BY test REGEXP '^[A-Za-z]+$'
        ,CAST(test as SIGNED INTEGER)
        ,CAST(REPLACE(test,'-','')AS SIGNED INTEGER)
        ,test

您会看到它们的计算结果都为 0,这不会为您提供所需的排序顺序。

您需要将值的数字部分与非数字部分分开,并分别对它们进行排序。像这样:

SELECT test    
FROM table1
ORDER BY substring_index(test,'-',1)
        ,CAST(substring(test, locate('-', test)+1)AS SIGNED INTEGER)
        ,test

如果您的实际数据不像您的示例数据那样简单明了,您可能需要进行调整。