[字符]-[数字]的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 |
我在 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 |