在SQL中使用[a-9]而不是[0-Z]对ORDER进行ORDER

Nic*_*Nic 8 sql sqlite sql-order-by

默认情况下,SQL在字符前排序数字.

所以,如果我有"名称"列:

abc
ab1
a1b
1ba
1bac
b21
Run Code Online (Sandbox Code Playgroud)

由于SQL按0-Z(前0到9,然后是aZ)排序,因此查询

SELECT * FROM ... ORDER BY name
Run Code Online (Sandbox Code Playgroud)

将导致:

1ba
1bac
a1b
ab1
abc
abc1
b21
Run Code Online (Sandbox Code Playgroud)

但我希望它按a-0排序(先是aZ,然后是0-9).

abc
abc1
ab1
a1b
b21
1ba
1bac
Run Code Online (Sandbox Code Playgroud)

我如何在查询中执行此操作?更具体地说,我如何在SQLite中执行此操作?

我在按字母顺序排序MySQL结果中找到了一个解决方案,但数字最后,但仅限于第一个字符.

Die*_*ego 0

这是我的想法:添加另一个“help_column”来检查第一个字符是否是数字并为其分配 1,否则分配 0,然后按此列排序,然后按名称排序:

select *, case
             when substring(name,1,1) like '[0-9]' then 1 
             else 0 
          end as help_order
from (
select 'ab1' as name union select 'a1b' as name union select '1ba' as name union select 'b21' as name
) a
order by help_order, name
Run Code Online (Sandbox Code Playgroud)

当然,如果有必要,您可能需要改进正则表达式 [0-9] 以处理多个数字。

当然,您应该替换内部查询(与您的表具有多个联合的查询)。