[字符]-[数字]的SQLite自定义顺序

Sqlite custom order by of [character]-[number]

我在 sqlite 中有以下记录。这是 id 字段:

id
=====
B-1
B-2
B-10
B-11

我想排序为:

B-1
B-2
B-10
B-11

但是我排序的时候是这样排序的:

B-1
B-10
B-11
B-2

这是sql

select * from mytable
order by id

如何将其排序为:

B-1
B-2
B-10
B-11

所有数据的格式为:

[character]-[number]

您必须先按破折号之前的 id 的字符串部分对 table 进行排序,然后再按破折号之后的数字排序。
所以你需要字符串函数来提取列的字符串和数字部分:

select * from mytable
order by 
  substr(id, 1, instr(id, '-')),
  substr(id, instr(id, '-') + 1) + 0

算术运算符 + 将强制将字符串的数字部分隐式转换为数字。
demo.
如果 ids 的模式与您的示例数据完全一样,并且始终以 1 个字母开头,然后是破折号,然后是数字,则可以简化代码:

select * from mytable
order by
  substr(id, 1, 1),
  substr(id, 3) + 0 

参见demo

结果:

| id   |
| ---- |
| B-1  |
| B-2  |
| B-10 |
| B-11 |