Sql 按字符串和整数排序
Sql order by string and int
我有 table 列天数,这个天数值是这样的:
day 1
day 2
day 3
day 4
...
day n
在我的数据库中,这些行没有排序,所以我想检索它按字符串后的 int 排序:
例如我有
day 2
day 4
day 1
day 3
=> 得到
day 1
day 2
day 3
day 4
更改列类型和值是最佳选择,但如果有检索它的选项,我想使用此结构。
应该有效:
select * from orderby order by day asc
编辑:
抱歉,我没有注意到它的字符串 + 整数:
修复了我的代码:
select * from orderby order by convert(int, replace(sdate, 'day ', '')) asc
orderby 子句可以按顺序使用 col 和 right 函数。
select * from tablename order by right(day,2) asc
将天数从 1 跳到最大值 99 ... 如果更多,也许可以查看天数和数字之间的 space 可能是另一种方式。
select a, CAST(substring(a from '\d+$') as int) Num from test_tbale order by Num;
结果
Day 0 | 0
Day 1 | 1
Day 3 | 3
Day 4 | 4
Day 5 | 5
Day 7 | 7
当前数据
select * from test_table;
a
-------
Day 3
Day 4
Day 5
Day 7
Day 0
Day 1
Postgres
使用 split_part
的结果相同
select a, split_part(a , ' ', 2)::int Num from test_table order by Num;
a | num
-------+-----
Day 0 | 0
Day 1 | 1
Day 3 | 3
Day 4 | 4
Day 5 | 5
Day 7 | 7
完整示例
create table test_table(a text);
insert into test_table select 'Day ' || floor(random()*100 +1)::text from generate_series(1,10);
select * from test_table;
a
--------
Day 19
Day 87
Day 86
Day 34
Day 50
Day 97
Day 84
Day 81
Day 67
Day 6
select a, CAST(substring(a from '\d+$') as int) Num from test_table order by Num;
a | num
--------+-----
Day 6 | 6
Day 19 | 19
Day 34 | 34
Day 50 | 50
Day 67 | 67
Day 81 | 81
Day 84 | 84
Day 86 | 86
Day 87 | 87
Day 97 | 97
对于MySql 8
select a ,CAST(REGEXP_SUBSTR(a, '[0-9]+$') as UNSIGNED) Num from test_table order by Num;
MySql 没有 REGEXP_SUBSTR
select a ,CAST(SUBSTRING(a, 4) as UNSIGNED) Num from test_table order by Num;
我有 table 列天数,这个天数值是这样的:
day 1
day 2
day 3
day 4
...
day n
在我的数据库中,这些行没有排序,所以我想检索它按字符串后的 int 排序: 例如我有
day 2
day 4
day 1
day 3
=> 得到
day 1
day 2
day 3
day 4
更改列类型和值是最佳选择,但如果有检索它的选项,我想使用此结构。
应该有效:
select * from orderby order by day asc
编辑:
抱歉,我没有注意到它的字符串 + 整数:
修复了我的代码:
select * from orderby order by convert(int, replace(sdate, 'day ', '')) asc
orderby 子句可以按顺序使用 col 和 right 函数。
select * from tablename order by right(day,2) asc
将天数从 1 跳到最大值 99 ... 如果更多,也许可以查看天数和数字之间的 space 可能是另一种方式。
select a, CAST(substring(a from '\d+$') as int) Num from test_tbale order by Num;
结果
Day 0 | 0
Day 1 | 1
Day 3 | 3
Day 4 | 4
Day 5 | 5
Day 7 | 7
当前数据
select * from test_table;
a
-------
Day 3
Day 4
Day 5
Day 7
Day 0
Day 1
Postgres
使用 split_part
的结果相同select a, split_part(a , ' ', 2)::int Num from test_table order by Num;
a | num
-------+-----
Day 0 | 0
Day 1 | 1
Day 3 | 3
Day 4 | 4
Day 5 | 5
Day 7 | 7
完整示例
create table test_table(a text);
insert into test_table select 'Day ' || floor(random()*100 +1)::text from generate_series(1,10);
select * from test_table;
a
--------
Day 19
Day 87
Day 86
Day 34
Day 50
Day 97
Day 84
Day 81
Day 67
Day 6
select a, CAST(substring(a from '\d+$') as int) Num from test_table order by Num;
a | num
--------+-----
Day 6 | 6
Day 19 | 19
Day 34 | 34
Day 50 | 50
Day 67 | 67
Day 81 | 81
Day 84 | 84
Day 86 | 86
Day 87 | 87
Day 97 | 97
对于MySql 8
select a ,CAST(REGEXP_SUBSTR(a, '[0-9]+$') as UNSIGNED) Num from test_table order by Num;
MySql 没有 REGEXP_SUBSTR
select a ,CAST(SUBSTRING(a, 4) as UNSIGNED) Num from test_table order by Num;