SQL 中的自然排序不起作用
Natural sorting in SQL does not work
我正在尝试对 SQL 中的一行 "naturally" 进行排序,我发现了这个答案,据说它完全符合我的需要:
但是当我尝试在 "SQL Fiddle" 中重新创建它时,我无法让它工作...
我做错了什么?
对于给定的数据库架构,您的尝试是否必要?
尝试这样的事情,
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
如果您的实际数据不像您的示例数据那样简单明了,您可能需要进行调整。
我正在尝试对 SQL 中的一行 "naturally" 进行排序,我发现了这个答案,据说它完全符合我的需要:
但是当我尝试在 "SQL Fiddle" 中重新创建它时,我无法让它工作...
我做错了什么?
对于给定的数据库架构,您的尝试是否必要?
尝试这样的事情,
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
如果您的实际数据不像您的示例数据那样简单明了,您可能需要进行调整。